视觉横向课题bug1:FileNotFoundError: Could not find module ‘MvCameraControl.dll‘ (or one of it

在pycharm中直接打开demo运行时,报错

 开始以为是主文件在import MvCameraControl时有问题,将文件直接复制和主文件一个文件夹,发现不行;

之后网上查找,得到的反馈可能是环境变量的问题,在配置然后进行无数次重启电脑之后,未果。。

最后终于找到了原因,就是因为Python3.8之后,变更了 Windows 下动态链接库 (DLL) 的加载规则。新的规则提高了安全性,默认情况下仅能从可信的位置(Trusted Locations)加载 DLL 依赖,一定程度上避免诸如 DLL 劫持之类的安全风险。

可信的位置包括:

  • DLL 所在的路径(加载 DLL 时提供 DLL 的完整路径或部分路径,文件存在则该路径即可信)。
  • 使用 add_dll_directory() 添加的路径。
  • (系统可信位置)

因此,下面这种之前可行的写法在 Windows Python 3.8 下会导致异常:

mb = ctypes.cdll.LoadLibrary("node.dll")   # 指定了 DLL 名,Python 3.8 下抛出异常 
                                           # `FileNotFoundError: Could not find module 'node.dll'` 

该语句指定待加载的模块名是 node.dll,但由于当前工作目录不在可信位置里,故不会搜寻当前目录下的 DLL,最终导致无法在可信位置里找到名字匹配的模块,遂异常。

而下面的写法则不会异常:

mb = ctypes.cdll.LoadLibrary("./node.dll")   # 指定了 DLL 的路径 

因为 ./node.dll 实际上是给出了模块路径而不是模块名,当显式地给出模块路径时,模块存在则该路径属于可信位置,可以加载。

可行的解决方案

由以上资料,至少可得到三种解决方案:

  1. 通过 add_dll_directory() 把 DLL 目录加入可信列表。
  2. 使用 ctypes.XXXDLL() 加载 DLL 时指定 winmode 参数(该参数将指定底层调用 Win32 API LoadLibraryEx 时所使用的 flags),将值指定为可以从本地路径加载,替换掉默认行为。
  3. 使用 ctypes.XXXDLL() 加载 DLL 时为 DLL 指定路径,而不仅是指定 DLL 名。

注:ctypes.XXXDLL() 中的 XXXDLL 泛指 CDLL, PyDLL, WinDLL 或 OleDLL

后面把这个dll文件的位置重新输入之后,又有错误

OSError: [WinError 193] %1 不是有效的 Win32 应用程序

这个错误的意思就是所引用的dll文件不是64位的,因为我电脑装的是64位的Python,所以去文档里面又找到了64位的dll文件,重新输入文件位置之后,错误解决!!

参考博客:Python 3.8 上 ctypes 加载 DLL 库抛出异常 FileNotFoundError: Could not find module 'node.dll' - 一年又一年的博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值