Я пытаюсь загрузить функцию в 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, но я все еще получаю предыдущее сообщение. Любая помощь будет здорово!
Использование папки 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 МБ устранило все проблемы, с которыми я столкнулся.
Спасибо за подробный вопрос и все шаги, которые вы использовали для демонстрации проблемы!