【问题标题】:Including xlrd/xlwt/xlutils with modules outside of python installation包括 xlrd/xlwt/xlutils 与 python 安装之外的模块
【发布时间】:2014-09-09 15:44:10
【问题描述】:

我是在 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 函数“导入 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 的文件夹。不幸的是,情况似乎并非如此。

感谢您的关注,我们将不胜感激。

附言我不想修改路径变量,因为我不知道谁会使用这个工具集,权限可能是个问题,等等。

【问题讨论】:

    标签: python arcgis xlrd xlwt xlutils


    【解决方案1】:

    我意识到我使用 imp.load_source 不正确。我想做的正确语法应该是:

    imp.load_source("xlrd",os.path.join(path,"xlrd","__init__.py"))
    

    但最后,我最终重写了我的代码,根本不需要 xlutils,因为我继续遇到导入错误,这些错误导致的问题比值得处理的问题多得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2013-02-12
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多