【问题标题】:How to fix ModuleNotFoundError when uploading virtualenv to IBM Cloud Functions?将 virtualenv 上传到 IBM Cloud Functions 时如何修复 ModuleNotFoundError?
【发布时间】:2019-10-15 14:56:53
【问题描述】:

我正在尝试使用安装了 opencv 的 virtualenv 将函数上传到 IBM Cloud Functions。但是,当我尝试在 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,并且我之前在使用 python:3-slim-strech docker 映像导入 opencv 时遇到问题,因为它没有一些必需的库,如 libsm6、libxext6 和 libxrender。

但是,当我在 IBM 用于其 python:3.7 运行时的 docker image 中运行 apt list 时,它包含了这些库。

我使用here. 所示的 docker 方法创建了 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 是因为 the runtime already has numpy installed, 这是 opencv 的唯一依赖项,并且因为包含 numpy 的 zip 文件超过了 48MB 的限制,无法将其上传到 Cloud Functions。

我应该能够毫无问题地导入 cv2,但我仍然收到上一条消息。任何帮助都会很棒!

【问题讨论】:

  • 感谢您提供详细的问题以及您用于演示问题的所有步骤!

标签: python-3.x opencv ibm-cloud ibm-cloud-functions


【解决方案1】:

使用 virtualenv 文件夹包含本地包不会自动从运行时inherit the global site-packages。这可以在使用 virtualenv 命令时使用--system-site-packages 标志启用。

将 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 操作分配足够的内存。我在使用默认 256MB 内存限制运行代码时遇到问题。将其增加到 1024MB 可以解决我遇到的任何问题。

【讨论】:

    猜你喜欢
    • 2018-04-09
    • 2019-01-24
    • 2021-06-05
    • 2021-08-09
    • 2018-08-05
    • 2019-04-08
    • 2018-12-07
    • 2021-04-05
    • 2021-05-03
    相关资源
    最近更新 更多