Установка numpy в gcloud App Engine под управлением Node.js среды выполнения (или даже пользовательской среды выполнения). Работает нормально локально, но получает ошибки при развертывании - PullRequest
0 голосов
/ 02 марта 2020

В настоящее время я развертываю сервер на основе node.js в облачном движке Google, который вызывает скрипт python для обработки некоторых данных.

В качестве краткого обзора мой код выполняется следующим образом:

  1. Front-end html отправляет данные на сервер
  2. Сервер получает данные
  3. Node.js, вызывает python сценарий и передает данные в виде асинхронной c функции в фоновом режиме
  4. Обработка данных выполнена

Проблема:

В процессе python используются библиотеки numpy и matplotlib, которые хорошо импортируются локально.

Но при развертывании возникают проблемы с импортом этих библиотек в App Engine.

Ошибка, которую я получаю:

Error: ImportError: No module named numpy
at PythonShell.parseError (/app/node_modules/python-shell/index.js:260)
at terminateIfNeeded (/app/node_modules/python-shell/index.js:139)
at ChildProcess.<anonymous> (/app/node_modules/python-shell/index.js:131)
at ChildProcess.emit (events.js:198)
at Process.ChildProcess._handle.onexit (child_process.js:248)

То, что я пробовал:

  1. в app.yaml
    • Изменение рабочей среды на custom с nodejs
    • Изменение файла docker и попытка установить туда numpy.

Добавлены строки в верхней части dockerfile:

    FROM gcr.io/google-appengine/python
    RUN virtualenv /env
    ENV VIRTUAL_ENV /env
    ENV PATH /env/bin:$PATH
    ADD requirements.txt /app/requirements.txt
    RUN pip install -r /app/requirements.txt
    ADD . /app

needs.txt:

numpy==1.6.1

, который компилируется нормально, но все равно выдает ошибку Error: ImportError: No module named numpy.

В процессе python заранее запустите процесс python и попробуйте установить numpy перед инициализацией основного сценария обработки (я знаю, что это не очень хорошая идея, поскольку он загрузит numpy каждый раз, когда происходит процесс, но я отчаянно хотел, чтобы он хотя бы работал любым возможным способом )
const spawn = require("child_process").spawn;
pythonProcess = spawn('python',["-m","pip", "install", "numpy", "matplotlib"]);

, который выдает ошибку как таковую:

Error: Python Process Recieved: /usr/bin/python: No module named pip
at Socket.pythonProcess.stderr.on (analysis.js:286)
at Socket.emit (events.js:198)
at addChunk (_stream_readable.js:288)
at readableAddChunk (_stream_readable.js:269)
at Socket.Readable.push (_stream_readable.js:224)
at Pipe.onStreamRead (internal/stream_base_commons.js:94)

Я прочитал некоторые документы онлайн, и кажется, что эти библиотеки можно импортировать, если вы используете runtime:python27 и добавляете туда библиотеки, но мое приложение обрабатывает 99% node.js и python часть - лишь малая часть приложения.

Я так растерялся, как решить эти проблемы.

Любая помощь будет принята.

Спасибо.

1 Ответ

0 голосов
/ 02 марта 2020

Я думаю, что вам нужно установить PIP в своей пользовательской среде, добавив

RUN apt-get install python -pip

Это мой Dockerfile для этого примера

FROM gcr.io/google-appengine/python
RUN apt-get install python-pip
RUN virtualenv /env
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
ADD . /app
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...