“ImportError:导入 cv2 时 DLL 加载失败:找不到指定的模块。”
参考:https://www.jamesbowley.co.uk/nbs/ImportError_dll_load_failed_while_importing_cv2.html
求赞求赞求赞,若对你产生帮助,鼓励一下
此情况为某些动态链接库(dll文件)在加载中没有找到。
该问题有很多blog,但是大部分都是在推荐使用Dependencies或者**dependency walker,**在此我也提供下载链接。这两个依赖分析软件都使用过,但不是很直观,对于这种复杂的依赖关系,排查起来很困难。
这里推荐使用 Process Monitor,这是一种适用于 Windows 的进程监视工具。此工具使我们能够查看 Python 尝试加载的 DLL 的名称以及它在运行时搜索的位置。
默认情况下,Process Monitor 会产生大量输出,因此最好尽可能多地过滤掉这些无用信息:
1、手动添加筛选器条目
由于我们只想查看 python.exe 进程访问的共享库,因此我们可以添加以下过滤器来简化我们的任务:
- Process Name -> is -> python.exe
- Operation -> is -> CreateFile
- Result -> is -> NAME NOT FOUND
- Result -> is -> SUCCESS
- Path -> contains -> .dll
- Path -> contains -> .pyd 不是必要的,如果缺少,错误将是“ModuleNotFoundError:没有名为’cv2’的模块”,但为了完整起见,我们将包含它)
2、使用进程监视器查找遗漏的 DLL
在继续之前,建议关闭任何其他 Python 进程,因为这些进程的输出会影响进程监视器的主窗口。
现在,请按照下列步骤操作:
1. 启动 Python。
2. 按进程监视器中的清除按钮(橡皮图标)以清除 Python 初始化期间生成的任何输出。
- 导入 OpenCV (
import cv2
)
为了演示它是如何工作的,我重新启动了Python,然后再次运行,如下图所示:
import cv2
3、自动搜索进程监视器日志以查找缺少的 DLL
Process Monitor 的输出可能难以筛选哪些dll是真的没有加载成功的。为了帮助解决这个问题,我们可以将输出导出到 .csv 文件,然后使用下面的python文件对其进行解析。
导出日志:
- 转到文件 -> 保存
2. 选择格式 ->逗号分隔值 (CSV)
3. 在“路径”下输入导出文件的所需位置
4. 点击保存
下面是一个 Python 代码,该程序将解析导出的 CSV 并打印缺少的 DLL 的名称:
import csv
from pathlib import Path
import re
def print_missing_libs(process_mon_export_file_path):
shared_libs = {}
with open(process_mon_export_file_path, mode='r', encoding='utf-8') as file:
csv_reader = csv.reader(file, delimiter=',')
for row in csv_reader:
key = Path(row[4]).name.lower()
val = row[5]
if key not in shared_libs or key in shared_libs and shared_libs[key] != 'SUCCESS':
shared_libs[key] = val
pattern = re.compile(r"__init__")
for entry, status in shared_libs.items():
if status == 'NAME NOT FOUND' and not re.search(pattern, entry):
print(entry)
def main():
process_mon_export_file_path = "Logfile.CSV"
print_missing_libs(process_mon_export_file_path)
if __name__ == '__main__':
main()
将该路径改为自己保存csv的路径,运行该代码即可输出没有加载的dll文件。
process_mon_export_file_path = "Logfile.CSV"
根据未加载的dll文件来排查环境变量设置及dll文件的缺失