我在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和xlwt函数“import xlrd”语句。这意味着如果用户需要,他/她可以将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。我尝试了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中,调用了info模块(来自xlrd / info.py),但是当我使用上面的代码时,我收到错误说“info”这个名字没有定义。
这让我相信我真的不知道发生了什么,因为我认为当导入 init .py文件时,它会像正常一样运行并查看其内容info.py的文件夹。不幸的是,情况似乎并非如此。
感谢您的关注,我们将非常感谢您的帮助。
P.S。我不想修改路径变量,因为我不知道谁将使用这个工具集,权限可能是一个问题,等等。
答案 0 :(得分:0)
我意识到我错误地使用了imp.load_source。我想做的正确语法应该是:
imp.load_source("xlrd",os.path.join(path,"xlrd","__init__.py"))
最后,我最终重写了我的代码,根本不需要xlutils,因为我继续遇到导致更多问题而不是值得处理的导入错误。