在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
实际上是给出了模块路径而不是模块名,当显式地给出模块路径时,模块存在则该路径属于可信位置,可以加载。
可行的解决方案
由以上资料,至少可得到三种解决方案:
- 通过
add_dll_directory()
把 DLL 目录加入可信列表。 - 使用
ctypes.XXXDLL()
加载 DLL 时指定winmode
参数(该参数将指定底层调用 Win32 API LoadLibraryEx 时所使用的flags
),将值指定为可以从本地路径加载,替换掉默认行为。 - 使用
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' - 一年又一年的博客