Я самоучка в мире 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. Я не хочу изменять переменные пути, так как понятия не имею, кто будет использовать этот набор инструментов, а разрешения, вероятно, будут проблемой и т. д.