У меня есть пакет следующего вида:Относительный импорта внутри плоского пакета
$ 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?
Отлично, Благодарю. Оказывается, '__name__' изменен, поэтому можно было бы выполнить' __name__ = 'folder.hello''. Тем не менее, ваше решение является самым элегантным. –