Как исправить 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, но я все еще получаю предыдущее сообщение. Любая помощь будет здорово!

Спасибо за подробный вопрос и все шаги, которые вы использовали для демонстрации проблемы!

James Thomas 30.05.2019 17:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
283
1
Перейти к ответу Данный вопрос помечен как решенный

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

Другие вопросы по теме

Похожие вопросы

Как ограничить доступ к неопределенной переменной класса/экземпляра?
Как предоставить python argparse.parser с аргументами внутри кода без аргументов командной строки?
Flake8: F821 неопределенное имя для глобальной переменной
Генерация тепловой карты с использованием координатных точек
Как добавить новый виджет в GridLayout без изменения размера старых виджетов?
Спросите у пользователя длину списка (n). Создайте линейный список из n целых чисел. Вставьте ноль после каждого четного значения. Распечатать новый список
С помощью subprocess.run программа не работает, но копирование текста из run([xxx]) работает. какие-либо предложения
Отправить данные в MySQL, полученные с последовательного порта
Как вы можете разработать сценарий, который готов принимать различное возможное количество аргументов в качестве argv?
TypeError: объект "Entry" не может быть вызван