在 virtualenv 中加载本机 Windows python 模块时,如何诊断 ImportError: DLL load failed?

Pau*_*ois 3 python virtualenv

我使用的是 Python 3.x 和 virtualenv——不是 conda,只是一个普通的 virtualenv。我激活 venv 并运行pip install opencv-python。但是, import cv2给我一个 DLL 未找到错误:

(tf) C:\>python
Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\src\venv\tf\lib\site-packages\cv2\__init__.py", line 4, in <module>
    from .cv2 import *
ImportError: DLL load failed: The specified module could not be found.
>>>
Run Code Online (Sandbox Code Playgroud)

这是一个 virtualenv 错误吗?如何找出缺少哪个模块/dll?

Pau*_*ois 6

一般解决“找不到模块”错误

尝试在正在加载的模块上使用 Microsoft 的 Dependency Walker 或 lucasg 的Dependency 。请务必从 virtualenv 的命令提示符运行 Dependencies.exe,以便它选择您修改后的 PATH。

导入行是from .cv2 import *,因此正在加载的模块与__init__.py(这是前导.)位于同一目录中并命名cv2-SOMETHING.pyd(这就是本机 Python 模块的样子)。将该文件加载到 Dependency.exe 中,它将显示 Windows 想要但找不到的 DLL。

在本例中,DLL 是Python3.dll。为什么不见了?由于virtualenv 错误已修复,但尚未发布到版本中 - 已经有一年多没有发布版本了。

特别是关于解决这个问题

github 问题建议修复:使用 venv。

或者,您可以python3.dll手动将缺失的内容复制到您的 virtualenv 中。您必须为您创建的每个 virtualenv 执行此操作。

copy "c:\Program Files\Python36\python3.dll" "c:\src\venv\tf\Scripts\"
Run Code Online (Sandbox Code Playgroud)