Если вы ничего не изменили с sys.path
или PYTHONPATH
, проблема в том, что модуль AReport
не «виден» из util.py.
Вы можете проверить это, добавив это вверху util.py
:
import sys
print(sys.path)
Это выведет список всех путей, где интерпретатор будет искать модули. Вы увидите, что там находится только путь к модулю Parent
, потому что именно здесь был запущен util.py
. Это объясняется в Путь поиска модуля Документация:
Когда импортируется модуль с именем spam
, интерпретатор сначала ищет
для встроенного модуля с таким именем. Если не найден, он ищет
для файла с именем spam.py
в списке каталогов, заданных
переменная sys.path
. sys.path
инициализируется из этих мест:
- Каталог, содержащий скрипт ввода (или текущий каталог
когда файл не указан).
PYTHONPATH
(список имен каталогов, с тем же синтаксисом, что и
переменная оболочки PATH
).
- Зависит от установки по умолчанию.
Когда вы делаете
from AReport import AReport
он будет искать модуль AReport
из каталога Parent, но его там нет, потому что только каталог report
находится непосредственно в каталоге / path / to / Parent, поэтому Python вызывает ModuleNotFoundError
. Если вы делаете вместо
from report.AReport import AReport
это будет работать, потому что пакет report
находится в /path/to/Parent.
Если вы хотите избежать префикса report.
при импорте, можно добавить пакет report
в sys.path
на util.py
:
import sys
sys.path.append("./report")
print(sys.path)
# should now show the /path/to/Parent/report on the list
Тогда ваш from AReport
импорт теперь будет работать. Другой вариант - добавить / path / to / Parent / report в переменную окружения PYTHONPATH
перед запуском util.py
.
export PYTHONPATH=$PYTHONPATH:/path/to/Parent/report
Обычно я использую опцию PYTHONPATH
для тестов, поэтому мне не нужно изменять код.