解决Python中 OSError: [WinError 126] 找不到指定的模块 的问题。
在进行Python开发的过程中,很可能遇到调用C++ DLL库的情况(为了提高效率),那么需要通过ctypes这个包,调用
然后可能就会碰到下面这个问题:大致意思就是找不到指定的库文件,但是这路径就是这样的。
Traceback (most recent call last):
File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
LoadDll()
File "E:/WorkSpace/BT/DemoProject/main.py", line 13, in LoadDll
lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 364, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] 找不到指定的模块。
Dll库的依赖问题,需要找出你用的DLL库所依赖的其他库文件,将其放到工程目录下即可。
如果你在工程目录下还建立文件来放DLL库文件,则需要添加文件夹路径,通过这个函数:os.chdir(“E:\WorkSpace\BT\tool\Download\res”)
寻找库文件所依赖的其他DLL库文件,推荐使用Dependency Walker,可以找到你用的库所依赖的其他库文件,然后去Windows/system32下去找到所依赖的其他库文件。
下载地址或者联系笔者邮箱
位数如果不匹配的话,报的错误不是126,而是193。这种情况直接重新使用x64重新编译生成64位的库文件即可。
Traceback (most recent call last):
File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
LoadDll()
File "E:/WorkSpace/BT/DemoProject/main.py", line 13, in LoadDll
lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 364, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
笔者在调试的时候,尝试了一下,发现了这个情况。
DLL库程序:直接编译可形成DLL库。
#ifndef PCH_H
#define PCH_H
#include "framework.h"
#include "iostream"
#define LIB_API __declspec(dllexport)
LIB_API void HelloWorld();
LIB_API int Sub(int a, int b);
#endif
#include "pch.h"
using namespace std;
LIB_API void HelloWorld()
{
cout << "HelloWorld" << endl;
}
LIB_API int Sub(int a, int b)
{
return ((a)-(b));
}
Python调用程序:
def LoadDll():
lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
lib.HelloWorld()
lib.Sub.argtypes = (c_int,c_int)
lib.Sub.restype = c_int
print(lib.Sub(3,1))
return lib.Sub(3,1)
Traceback (most recent call last):
File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
LoadDll()
File "E:/WorkSpace/BT/DemoProject/main.py", line 14, in LoadDll
lib.HelloWorld()
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 377, in __getattr__
func = self.__getitem__(name)
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 382, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'HelloWorld' not found