Модуль Python не найден при использовании Docker - PullRequest
1 голос
/ 25 февраля 2020

У меня есть приложение Angular - Flask, которое я пытаюсь Dockerize. Одним из используемых Python файлов является файл с именем trial.py . Этот файл использует модуль с именем _trial.pyd . Когда я запускаю проект на локальном все работает нормально. Однако, когда я выполняю dockerize, используя следующий код, и запускаю, он выдает ошибку «Module _trial not found».

FROM node:latest as node
COPY . /APP
COPY package.json /APP/package.json
WORKDIR /APP
RUN npm install
RUN npm install -g @angular/cli@7.3.9
CMD ng build --base-href /static/

FROM python:3.6
WORKDIR /root/
COPY --from=0 /APP/ .
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]

Куда я иду не так? Нужно ли мне изменить какой-либо путь в моем файле Docker?

РЕДАКТИРОВАТЬ: Структура каталогов:

  • APP [папка с sr c Angular files]
  • stati c [папка с js файлами]
  • templates [папка с index.html]
  • _trial.pyd
  • app.py [Начальная точка выполнения]
  • Пакет Dockerfile
  • . json
  • needs.txt
  • trial.py

app.py вызывает trial.py (успешно).

trial.py нуждается в _trial.pyd. Я пытаюсь вызвать его с помощью import _trial .

Локально работает, но когда докеризую его, я получаю следующее сообщение об ошибке:

Traceback ( последний вызов был последним):

Файл "app.py", строка 7, в

from trial import *

Файл "/root/trial.py", строка 15, в

import _trial

ModuleNotFoundError: Нет модуля с именем '_trial'

Запущены следующие команды:

docker image build -t prj .

docker container run --publish 5000:5000 --name prj prj

UPDATE Это способен распознавать другие файлы .py, но не модуль .pyd.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Решено! Проблема заключалась в том, что я использовал файлы .pyd в контейнере Linux. Однако, похоже, что Linux не поддерживает файлы .pyd. Вот почему он не смог обнаружить модуль _trial.pyd. Мне пришлось сгенерировать файл общего объекта (.so) (то есть _trial.so), и он работал нормально.

РЕДАКТИРОВАТЬ. Файл .so был сгенерирован в системе Linux мной. Генерация .so в Windows и последующее его использование в контейнере Linux приводит к ошибке «недопустимый заголовок ELF».

1 голос
/ 25 февраля 2020

Я думаю, это может быть связано со следующими причинами

Путь

Убедитесь, что нужный файл находится в pythonpath. Похоже, вы сделали это, так что, вероятно, не этот.

Режим отладки

Если вы работаете в режиме отладки, вам нужно будет переименовать этот модуль "_trail .pyd "to" _trail_d.pyd "

Отсутствует DLL

Для файла .pyd может потребоваться dll или другая зависимость, которая недоступна и не может быть импортирована из-за который. Существуют такие инструменты, как зависимости.exe или this , которые позволяют вам найти то, что требуется

Проблема пространства имен

Если был файл уже называется "_trail.py" в пути python, что может привести к нежелательному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...