Абсолютные результаты импорта в ModuleNotFoundError

1

Python 3.6

Я написал некоторые компоненты, и я пытаюсь импортировать один из них в другой.

Вот как выглядит структура моего проекта:

.
└── components
    ├── __init__.py
    ├── extract
    │   └── python3
    |       ├── __init__.py
    │       └── extract.py
    └── transform
        └── python3
            ├── __init__.py
            └── preprocess.py

extract.py

from components.transform.python3.preprocess import my_function

if __name__ == '__main__':
    my_function()

preprocess.py

def my_function():
    print("Found me")

Когда я запускаю python components/extract/python3/extract.py

Я вижу следующую ошибку:

ModuleNotFoundError: нет модуля с именем "компоненты"

Я добавил пустой файл __init__.py в каталоги, которые содержат модули, а также каталог пакетов верхнего уровня.

  • 2
    Непонятно, что именно вы пытались и что подразумеваете под «безуспешно», но, насколько я понимаю, проблема действительно заключается в отсутствии каких-либо файлов __init__.py . Python думает components представляет собой модуль (то есть .py файл), вы явно хотите , чтобы рассматривать его как пакет (из которого можно получить доступ с помощью модулей . Обозначений) - и сделать это, он должен содержать __init__.py
  • 0
    @RobinZigmond Я добавил файл __init__.py в каталоги с модулями в них, а также в каталог верхнего уровня.
Показать ещё 5 комментариев
Теги:
python-3.x

1 ответ

1
Лучший ответ

Хорошо, для импорта требуется, чтобы пакет верхнего уровня был доступен в Python PATH (sys.path).

Итак, чтобы это работало, вы должны:

  • перейдите в каталог, содержащий components
  • доп . к Путьу Питона:

    export PYTHONPATH='.'
    
  • запустите ваш скрипт:

    python components/extract/python3/extract.py
    

В моей системе он успешно отображает:

Found me
  • 0
    Это постоянное решение? Он работает при локальном запуске, но нужно ли делать то же самое, если он запускается на сервере для автоматизированных процессов?
  • 0
    @JonathanPorter: для автоматизированного процесса правильным способом будет постоянное размещение каталога, содержащего компоненты, в пути Python (на стороне сервера).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню