Python3: относительный импорт за пределы верхнего уровня
Да, есть похожие вопросы, но они не отвечают на мой вопрос. Моя структура каталогов следующая, все файлы __init__.py пустые.
Package/
__init__.py
sub_package1/
__init__.py
file1.py
sub_package2/
__init__.py
file2.py
В file2.py
У меня есть следующий код:
from ..sub_package1 import file1
Я получаю ошибку, упомянутую выше,
ValueError: attempted relative import beyond top-level package
Существует несколько пакетов scikit-learn, которые выполняют аналогичные операции импорта, и это работает для них.
Команда, которая вызвала ошибку:
- рабочий каталог:
Package/
- Команда:
python /path/to/Package/sub_package2/file2.py
1 ответ
Работает ли относительный импорт, к сожалению, зависит от того, как вы вызываете код.
$ mkdir Package Package/sub_package{1,2}
$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py
$ touch Package/sub_package1/file1.py
$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py
$ python Package/sub_package2/file2.py
Traceback (most recent call last):
File "Package/sub_package2/file2.py", line 1, in <module>
from ..sub_package1 import file1
ValueError: Attempted relative import in non-package
$ python -m Package.sub_package2.file2
$
Когда ты python Package/sub_package2/file2.py
среда выполнения не признает этого Package/sub_package2
является частью пути модуля. Он думает, что модуль, с которым вы работаете, просто file2
, Таким образом, он не может интерпретировать ..
относительный импорт.
При импорте модуля, используя его полный путь, как python -m ...
(как и любой обычный оператор импорта), полный путь импорта распознается и относительный импорт может быть правильно интерпретирован.