Как исправить ModuleNotFoundError при загрузке virtualenv в IBM Cloud Functions? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь загрузить функцию в 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 с помощью образа докера 3-slim-strech, поскольку у него не было некоторых необходимых библиотек, таких как libsm6, libxext6 и libxrender.

Однако, когда я запустил apt list в образе докера , который IBM использует для своего питона: 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 МБ для загрузки его в облачные функции.

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

1 Ответ

3 голосов
/ 30 мая 2019

Использование папки 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 МБ позволило устранить все проблемы, с которыми я столкнулся.

...