2012-06-18 8 views
1

Я следующая структура каталогов:Python относительного импорта для вызова сценария из случайного каталога

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

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

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

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

Я попытался относительно импорта, но я получаю «Покушение Относительного импорта ошибочного Non-пакет»

from ..a import someclass as cls 

Я имею в обеих test1 __init__.py, test2

ли кто-то есть идея, как это сделать Работа? Есть PYTHONPATH путь?

ответ

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') 
+0

Я есть '__init __. Py'. Тем не менее это не работает. '__file__' не годится, когда я третий скрипт вызывает b.py с помощью execfile. print '__file__' печатает имя другого файла. –

+0

@iamrohitbanga: Я думаю, что вы столкнетесь с проблемами, несмотря ни на что, если вы пытаетесь разрешить скрипту 'execfile' модуль в пакете, который зависит от других модулей. 'execfile' оценивает чистый код модуля, поэтому все, что было относительным в модуле, также должно относиться аналогично в сценарии exec'12. – jdi

+0

Думаю, вы правы. Думаю, мне нужно поиграть, чтобы найти более удобное решение для построения среды сборки. –