Python дает относительную ошибку импорта для пакета? [Дубликат]

Это похоже на то, что вы пытаетесь сделать, будет намного лучше обслуживаться глобальным поиском и заменой.

148
задан carl 17 December 2009 в 00:27
поделиться

2 ответа

Вы импортируете из пакета «sub». start.py не входит в пакет, даже если присутствует __init__.py.

Вам нужно будет запустить свою программу из одного каталога через parent.py:

./start.py

./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py

С start.py:

import pkg.sub.relative

Теперь pkg - это пакет верхнего уровня, и ваш относительный импорт должен работать.


Если вы хотите придерживаться своего текущего макета, может просто использовать import parent. Поскольку вы используете start.py для запуска вашего интерпретатора, каталог, в котором находится start.py, находится в вашем пути python. parent.py живет там как отдельный модуль.

Вы также можете безопасно удалить верхний уровень __init__.py, если вы ничего не импортируете в скрипт дальше по дереву каталогов.

127
ответ дан ebo 18 August 2018 в 19:14
поделиться
  • 1
    Вы вводите в заблуждение термины «модуль» и «пакет». «start.py» представляет собой модуль «start», «mod» и «mod.sub» - это пакеты, «mod» - пакет toplevel. – Ferdinand Beyer 17 December 2009 в 00:45
  • 2
    Спасибо, но это честно кажется действительно глупым. Для такого красивого языка я не могу поверить, что дизайнеры создадут такое ограничение. Разве нет другого пути? – carl 17 December 2009 в 00:48
  • 3
    Это не глупо. Относительный импорт - это среднее значение для ссылок на модули для родственных связей внутри пакета. Если вы хотите импортировать модуль верхнего уровня, используйте абсолютный импорт. – Ferdinand Beyer 17 December 2009 в 16:30
  • 4
    Не глупо? Таким образом, в bash не удалось найти относительный верхний регистр с ".." не будет вас беспокоить? – e-satis 4 March 2010 в 10:27
  • 5
    Мне кажется, что идея python заключается в использовании "абсолютного" импортирует из каталога, где вы запустили родительский скрипт. Таким образом, вы можете использовать абсолютный путь & quot; import parent & quot; для импорта родительского модуля из родного брата. И относительный импорт какого-то наследия или что-то еще .. – Odysseus 6 April 2015 в 15:12

Если вы назовете relative.py напрямую, и если вы действительно хотите импортировать из модуля верхнего уровня, вы должны явно добавить его в список sys.path. Вот как это должно работать:

# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')

# Now you can do imports from one directory top cause it is in the sys.path
import parent

# And even like this:
from parent import Parent

Если вы считаете, что приведенное выше может вызвать какую-то несогласованность, вы можете использовать это вместо:

sys.path.append(sys.path[0] + "/..")

sys.path[0] относится к путь, по которому проходила точка входа.

22
ответ дан TechJS 18 August 2018 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: