2012-02-24 2 views
0

У меня есть пакет следующего вида:Относительный импорта внутри плоского пакета

$ ls folder 
entry_point.py hello.py __init__.py utils.py 

Это пакет, и я могу относиться к ней как таковые:

$ python2.7 
>>> import folder.utils 
>>> 

Я хочу использовать относительный импорт между этими модулями Python.

Я знаю, что не могу использовать относительный импорт в точке входа, где я называю интерпретатор. Тем не менее, я все еще получаю ImportError из моих импортируемых файлов:

$ python2.7 folder/entry_point.py 
Traceback (most recent call last): 
    File "folder/entry_point.py", line 1, in <module> 
    from hello import say_hello 
    File "/tmp/folder/hello.py", line 1, in <module> 
    from .utils import say 
ValueError: Attempted relative import in non-package 

Это скорее противоречит здравому смыслу, это пакет, он просто не рассматривается в качестве одного из-за entry_point.py, имеющий __name__ набор для __main__ (в соответствии с PEP 328).

Я удивлен, что hello.py имеет __name__hello, а не folder.hello. Это мешает мне использовать относительный импорт на hello.py.

Как использовать относительный импорт в этом пакете? Я вынужден переместить hello.py и utils.py в подпакет libs?

ответ

0

Если вы хотите folder быть модуль внутри более крупного проекта, и вы хотите, чтобы иметь возможность запускать entry_point.py для использования вашего folder модуля - перемещение entry_point.py один уровень вверх:

from folder.hello import say_hello 

if __name__ == "__main__": 
    say_hello() 

Import paths - the right way?

+0

Отлично, Благодарю. Оказывается, '__name__' изменен, поэтому можно было бы выполнить' __name__ = 'folder.hello''. Тем не менее, ваше решение является самым элегантным. –

Смежные вопросы