我是在 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 函数都可以通过简单的“import xlrd”调用 xlrd 和 xlwt 函数"声明。这意味着如果用户愿意,他/她可以将 pythonmod 文件夹移动到 python site-packages 文件夹,一切都会运行良好,即使 xlrd/xlwt/xlutils 已经安装。
问题:一切都很好,直到我尝试在 general.py 中使用 xlutils。具体来说,我需要“从 xlutils.copy 导入副本”。但是,这会引发一连串的导入错误。一是xlutils/copy.py使用“from xlutils.filter import process,XLRDReader,XLWTWriter”。我通过像这样修改 xlutils/copy.py 解决了这个问题:
try:
from xlutils.filter import process,XLRDReader,XLWTWriter
except ImportError:
from filter import process,XLRDReader,XLWTWriter
我认为这适用于其他情况,但是 xlutils 包中有需要导入 xlrd 的模块。我尝试遵循这个建议,但是当我使用
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 中,调用了 info 模块(来自 xlrd/info.py),但是当我使用上面的代码时,我收到一个错误,指出名称“info”未定义.
这让我相信我真的不知道发生了什么,因为我认为当init .py 文件被导入时,它会像正常一样运行并在其包含的文件夹中查找 info.py。不幸的是,情况似乎并非如此。
感谢您的关注,任何帮助将不胜感激。
ps 我不想修改路径变量,因为我不知道谁将使用这个工具集,权限可能是个问题,等等。