windows:ImportError:导入 cv2 时 DLL 加载失败:找不到指定的模块 (注:使用Process Monitor分析更加直观)

“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 进程访问的共享库,因此我们可以添加以下过滤器来简化我们的任务:
在这里插入图片描述

  1. Process Name -> is -> python.exe
  2. Operation -> is -> CreateFile
  3. Result -> is -> NAME NOT FOUND
  4. Result -> is -> SUCCESS
  5. Path -> contains -> .dll
  6. Path -> contains -> .pyd 不是必要的,如果缺少,错误将是“ModuleNotFoundError:没有名为’cv2’的模块”,但为了完整起见,我们将包含它)
    在这里插入图片描述

2、使用进程监视器查找遗漏的 DLL

在继续之前,建议关闭任何其他 Python 进程,因为这些进程的输出会影响进程监视器的主窗口。

现在,请按照下列步骤操作:

1. 启动 Python。
2. 按进程监视器中的清除按钮(橡皮图标)以清除 Python 初始化期间生成的任何输出。

在这里插入图片描述

  1. 导入 OpenCV (import cv2)

为了演示它是如何工作的,我重新启动了Python,然后再次运行,如下图所示:

在这里插入图片描述

import cv2

3、自动搜索进程监视器日志以查找缺少的 DLL

Process Monitor 的输出可能难以筛选哪些dll是真的没有加载成功的。为了帮助解决这个问题,我们可以将输出导出到 .csv 文件,然后使用下面的python文件对其进行解析。

导出日志:

  1. 转到文件 -> 保存

在这里插入图片描述
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文件的缺失

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值