Включая xlrd/xlwt/xlutils с модулями вне установки python

Я самоучка в мире 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 уже установлены.

ПРОБЛЕМА: Все отлично, пока я не попытаюсь использовать xlutils в general.py. В частности, мне нужно «из 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), НО когда я использую приведенный выше код, я получаю сообщение об ошибке, что имя "информация" не определено.

Это заставляет меня поверить, что я действительно не знаю, что происходит, потому что я думал, что когда файл init.py был импортирован, он будет работать как обычно и искать информацию в содержащей его папке. .py. Это, к сожалению, не так.

Спасибо за ваш интерес, и любая помощь будет принята с благодарностью.

p.s. Я не хочу изменять переменные пути, так как понятия не имею, кто будет использовать этот набор инструментов, а разрешения, вероятно, будут проблемой и т. д.


person mr.adam    schedule 09.09.2014    source источник


Ответы (1)


Я понял, что неправильно использовал imp.load_source. Правильный синтаксис того, что я хотел сделать, должен был быть таким:

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

В конце концов, однако, я переписал свой код, чтобы вообще не нуждаться в xlutils, потому что у меня по-прежнему возникали ошибки импорта, которые вызывали гораздо больше проблем, чем стоило решать.

person mr.adam    schedule 11.09.2014