Я пытаюсь контейнеризировать свою программу. Локально все работает нормально, но при сборке и запуске контейнера импорт работает не так, как хотелось бы.
Вот мой Dockerfile
FROM python:3.8
WORKDIR /src
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
CMD ["python3", "./app/run.py"]
Вот общая файловая структура, которую я создаю.
app
├── module
│ ├── file.py
│ └── __init__.py
├── __init__.py
└── run.py
run.py выглядит примерно так:
from app.module import Class
instance = Class(args)
instance.do_stuff
и мое приложение/модуль/init.py имеет:
from .file import Class
Опять же, это отлично работает, когда я запускаю его локально. Однако в конечном итоге я получаю ошибку импорта, когда запускаю это в докере.
Traceback (most recent call last):
File "./app/run.py", line 3, in <module>
from app.module import Class
ModuleNotFoundError: No module named 'app'
Я могу запустить свой код в контейнере, изменив импорт в run.py на from module import Class
вместо from app.module import Class
. Однако мне хотелось бы понять это лучше. Честно говоря, я бы предпочел, чтобы мой импорт был app.module, чтобы сделать локальный импорт более очевидным.
🤔 А знаете ли вы, что...
Python активно используется в научных и инженерных вычислениях.
Из https://docs.python.org/3/using/cmdline.html:
Если имя сценария напрямую относится к файлу Python, каталог, содержащий этот файл, добавляется в начало sys.path, и файл выполняется как основной модуль.
Каталог app
добавлен в путь поиска. Если вы хотите, чтобы каталог, содержащий app
, был добавлен в путь поиска, вы можете PYTHONPATH=$(pwd)
или аналогичный.
Изучите PYTHONPATH
и импортируйте документацию по Python. Рассмотрите возможность написания пакета Python для использования в вашем коде относительных выводов. https://docs.python.org/3/reference/import.html https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH