Как исправить ошибку ModuleNotFoundError при загрузке virtualenv в IBM Cloud Functions?

Я пытаюсь загрузить функцию в IBM Cloud Functions с помощью virtualenv, на котором установлен opencv. Однако, когда я пытаюсь запустить действие в IBM Cloud, он говорит:

{
  "error": "Traceback (most recent call last):
File \"/action/1/src/exec__.py\", line 43, in <module>
from main__ import main as main
File \"/action/1/src/main__.py\", line 1, in <module>
import requests, base64, json, cv2\nModuleNotFoundError: No module named 'cv2'"
}

Для этого я использую среду выполнения python: 3.7. Я думал, что это проблема библиотеки, так как эта среда выполнения использует Debian Stretch, и у меня раньше были проблемы с импортом opencv с изображением докера python: 3-slim-strech, поскольку в нем не было некоторых необходимых библиотек, таких как libsm6, libxext6 и libxrender.

Однако когда я запустил apt list в образе докера, IBM использует для своей среды выполнения python: 3.7, в него включены эти библиотеки.

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

docker run --rm -v "$PWD:/tmp" ibmfunctions/action-python-v3.7 /bin/bash -c 
"cd tmp; virtualenv virtualenv; source virtualenv/bin/activate; 
pip install --no-deps opencv-python;"

Я использовал --no-deps, потому что в уже есть numpy установлен, что является единственной зависимостью opencv, и поскольку с включенным numpy размер zip-файла превышает 48 МБ, чтобы загрузить его в Cloud Functions.

Я смогу импортировать cv2 без проблем, но все равно получаю предыдущее сообщение. Любая помощь была бы замечательной!


person Roy Henriquez    schedule 29.05.2019    source источник
comment
Спасибо за подробный вопрос и за все шаги, которые вы использовали для демонстрации проблемы!   -  person James Thomas    schedule 30.05.2019


Ответы (1)


Использование папки virtualenv для включения локальных пакетов не приводит к автоматическому наследованию глобальные пакеты сайтов из среды выполнения. Это можно включить с помощью флага --system-site-packages при использовании команды virtualenv.

Измените команду Docker на следующую, чтобы это работало:

docker run --rm -v "$PWD:/tmp" ibmfunctions/action-python-v3.7 /bin/bash -c 
"cd tmp; virtualenv --system-site-packages virtualenv; source virtualenv/bin/activate; 
pip install opencv-python;"

--no-deps больше не нужен, поскольку зависимость numpy уже удовлетворена глобальным пакетом сайта.

Выполнение ваших команд с помощью этого обновленного скрипта Docker теперь работает для меня.

Убедитесь, что для действия OpenWhisk выделено достаточно памяти. У меня были проблемы с запуском кода с ограничением памяти по умолчанию 256 МБ. Увеличение этого значения до 1024 МБ устранило все проблемы, с которыми я столкнулся.

person James Thomas    schedule 30.05.2019