我在Python世界里是自学的,所以一些结构惯例对我来说还是有点模糊。然而,我已经非常接近我想要完成的目标,但遇到了一个更大的问题。
基本上,我有一个类似这样的目录结构,它位于常规python安装之外(这将分发给那些不需要知道python安装是什么,但会有ArcGIS标准的安装)的人:
top_directory/
ArcToolbox.tbx
scripts/
ArcGIStool.py (script for the tool in the .tbx)
pythonmod/
__init__.py
general.py
xlrd/ (copied from my own python installation)
xlwt/ (copied from my own python installation)
xlutils/ (copied from my own python installation)因此,我喜欢这个目录结构,因为所有的ArcGIStool.py脚本都调用pythonmod包中的函数(就像在general.py中的那样),并且所有的general.py函数都可以用简单的“导入xlrd”语句调用xlrd和xlwt函数。这意味着如果用户需要,他/她可以将pythonmod文件夹移动到python站点-packages文件夹,即使xlrd/xlwt/xlutils已经安装,一切都会运行良好。
问题是:一切都很好,直到我尝试在general.py中使用xlutils。具体来说,我需要“从xlutils.copy导入副本”。然而,这会引发一系列导入错误。其中之一是xlutils/copy.py使用“来自xlutils.filter导入过程、XLRDReader、XLWTWriter”。我通过这样修改xlutils/copy.py来解决这个问题:
try:
from xlutils.filter import process,XLRDReader,XLWTWriter
except ImportError:
from filter import process,XLRDReader,XLWTWriter我认为这在其他情况下会很好,但是xlutils包中有一些模块需要导入xlrd。我试着遵循this建议,但是当我使用
try:
import xlrd
except ImportError:
import os, sys, imp
path = os.path.dirname(os.path.dirname(sys.argv[0]))
xlrd = imp.load_source("pythonmod.xlrd",os.path.join(path,"xlrd","__init__.py"))我得到了一个新的导入错误:在xlrd/init.py中,信息模块被调用(来自xlrd/info.py),但是当我使用上面的代码时,我会收到一个错误,说明名称" info“没有定义。
这使我相信,我并不真正知道发生了什么,因为我认为当导入init.py文件时,它会像正常运行一样运行,并在其包含的info.py文件夹中查找。不幸的是,情况似乎并非如此。
感谢您的关心,如有任何帮助,将不胜感激。
附注:我不想修改路径变量,因为我不知道谁将使用这个工具集,权限可能是一个问题,等等。
发布于 2014-09-11 15:01:33
我意识到我使用imp.load_source是错误的。我想要做的正确语法应该是:
imp.load_source("xlrd",os.path.join(path,"xlrd","__init__.py"))最后,我重写了代码,根本不需要xlutils,因为我仍然存在导入错误,导致的问题比需要处理的问题多得多。
https://stackoverflow.com/questions/25748856
复制相似问题