在Python安装外包含xlrd/xlwt/xlutils模块
我自学了Python,所以对一些结构上的约定还不是很清楚。不过,我已经快要实现我想做的事情了,但遇到了一个比较大的问题。
基本上,我有一个这样的目录结构,它会放在正常的Python安装目录之外(这是为了分发给那些不需要了解Python安装的人,他们会使用ArcGIS自带的Python):
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。具体来说,我需要“from xlutils.copy import 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。不幸的是,似乎并不是这样。
感谢你的关注,任何帮助都将不胜感激。
附言:我不想修改路径变量,因为我不知道谁会使用这个工具集,权限可能也会是个问题等等。
1 个回答
我意识到我使用imp.load_source的方式不对。其实我想做的事情,正确的写法应该是:
imp.load_source("xlrd",os.path.join(path,"xlrd","__init__.py"))
不过最后,我还是把代码重写了一遍,完全不需要用到xlutils,因为我一直遇到导入错误,这些错误带来的麻烦远比解决它们要麻烦得多。