Относительный импорт внутри плоской упаковки - PullRequest
0 голосов
/ 24 февраля 2012

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

$ 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?

1 Ответ

0 голосов
/ 24 февраля 2012

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

from folder.hello import say_hello

if __name__ == "__main__":
    say_hello()

Импорт путей - правильный путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...