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, которые выполняют аналогичные операции импорта, и это работает для них.

Команда, которая вызвала ошибку:

  1. рабочий каталог: Package/
  2. Команда: 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 ... (как и любой обычный оператор импорта), полный путь импорта распознается и относительный импорт может быть правильно интерпретирован.

Другие вопросы по тегам