Подтвердить что ты не робот

Принудительно импортировать модуль из текущего каталога

У меня есть пакет p с модулями a и b. a полагается на b:

b.py Содержание:

import a

Однако я хочу, чтобы b импортировал мой a модуль из того же каталога p, а не только из a модуля из PYTHONPATH.

Итак, я пытаюсь изменить b.py следующим образом:

from . import a

Это работает до тех пор, пока я импортирую b, когда я за пределами каталога пакетов p. Учитывая следующие файлы:

/tmp
    /p
       a.py
       b.py
       __init__.py

Следующие работы:

$ cd /tmp
$ echo 'import p.b' | python

Не работает следующее:

$ cd /tmp/p
$ echo 'import b' | python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "b.py", line 1, in <module>
    from . import a
ValueError: Attempted relative import in non-package

Почему?

P.S. Я использую Python 2.7.3

4b9b3361

Ответ 1

После перезаписи документа импорта , правильный ответ на мою оригинальную проблему:

Чтобы b импортировал a из своего собственного пакета, его достаточно, чтобы записать следующее в b:

import a

Вот цитата из документов:

Подмодулы часто должны ссылаться друг на друга. Например, модуль объемного звучания может использовать модуль эхо-сигнала. Фактически, такие ссылки настолько распространены, что оператор импорта сначала выглядит в содержащем пакета, прежде чем искать путь поиска стандартного модуля.

Примечание.. Как указывает J.F. Себастьян в комментарии ниже, использование неявного импорта не рекомендуется, и они, по сути, ушли на Python 3.

Ответ 2

Поскольку в /p есть файл __init__.py. Этот файл сообщает Python: "Все модули в этой папке находятся в пакете p".

Пока существует файл __init__.py, вы можете импортировать b как p.b, независимо от того, где вы находитесь.

Таким образом, правильный импорт в b.py будет следующим: import p.a

Ответ 3

Относительный импорт работает только в пакетах.

Если вы импортируете b из того, где вы находитесь, нет понятия пакета, и, следовательно, для относительного импорта нет способа.

Если вы импортируете p.b, это модуль b в пакете c.

Это не структура каталогов, а структура пакетов.