У меня есть пакет следующей формы:
$ ls folder
entry_point.py hello.py __init__.py utils.py
Это пакет, и я могу относиться к нему так:
$ python2.7
>>> import folder.utils
>>>
Я хочу использовать относительный импорт между этими модулями Python.
$ cat folder/entry_point.py
from hello import say_hello
if __name__ == "__main__":
say_hello()
$ cat folder/hello.py
from .utils import say
def say_hello():
say()
$ cat folder/utils.py
def say():
print "hello world"
Я знаю, что не могу использовать относительный импорт в точке входа, где я вызываю переводчика. Тем не менее, я все еще получаю 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?