视觉横向课题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' - 一年又一年的博客

你可能感兴趣的:(pycharm,python)