Относительный импорт Python для вызова скрипта из случайного каталога

У меня следующая структура каталогов:

test1/
test1/a.py
test1/test2/b.py

b.py необходимо импортировать класс в a.py. Поэтому я могу добавить следующую строку в b.py перед импортом файла.

sys.path.append (os.path.dirname (sys.argv [0]) + "/ ..")

Это работает, и я могу вызывать b.py из любого каталога, и он может импортировать файл. Но это не удается, когда я пишу сценарий в другом каталоге для вызова этого файла с помощью execfile ().

Я пробовал относительный импорт, но получаю сообщение об ошибке «Попытка относительного импорта без пакета»

from ..a import someclass as cls

У меня __init__.py и в test1, и в test2

Есть у кого-нибудь идеи, как заставить работать? PYTHONPATH путь?


person Rohit Banga    schedule 18.06.2012    source источник


Ответы (1)


Проблема в том, что execfile будет оценивать вызываемый файл как чистый код Python. Каждый относительный оператор импорта внутри b.py (и любой импортированный им пакетный модуль) должен оставаться верным вашему вызывающему скрипту.

Одно из решений - не использовать какие-либо относительные пути импорта в пакете. Убедитесь, что пакет test1 также находится на вашем PYTHONPATH.

b.py

from test1 import a

С test1 в вашем PYTHONPATH импорт a должен быть успешным в вашем execfile

>>> import sys
>>> sys.path.append('/path/to/parent/of_test1')
>>> execfile('/path/to/parent/of_test1/test1/test2/b.py')
person jdi    schedule 19.06.2012
comment
У меня есть __init__.py. Тем не менее, это не работает. __file__ не годится, когда я третий скрипт вызывает b.py с использованием execfile. print __file__ печатает имя другого файла. - person Rohit Banga; 19.06.2012
comment
@iamrohitbanga: Я думаю, вы столкнетесь с проблемами независимо от того, что, если вы пытаетесь разрешить скрипту execfile модуль в пакете, который зависит от других модулей. execfile оценивает чистый код модуля, поэтому все относительное в модуле также должно быть относительным, так же как и в сценарии выполнения. - person jdi; 19.06.2012
comment
Думаю ты прав. Думаю, мне нужно поэкспериментировать, чтобы найти более удобное решение для среды сборки. - person Rohit Banga; 19.06.2012
comment
@iamrohitbanga: я только что переписал свой ответ - person jdi; 19.06.2012