Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。
Python调用C++ DLL库
解决Python中 OSError: [WinError 126] 找不到指定的模块 的问题。
一、问题:
在进行Python开发的过程中,很可能遇到调用C++ DLL库的情况(为了提高效率),那么需要通过ctypes这个包,调用
- ctypes.cdll.LoadLibrary(“path”)或者
- ctypes.CDLL(“path”),
然后可能就会碰到下面这个问题:大致意思就是找不到指定的库文件,但是这路径就是这样的。
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 LoadDlllib = 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] 找不到指定的模块。
二、我尝试的解决办法
- 在写路径时,尝试过单引号,双引号,斜杠和反斜杠,但都不是引起这个的原因,
- 怀疑是python安装包缺失的问题,然后就是去安装ctypes的库,安装一大堆之后也没有解决问题。
三、网上解决办法:
- 说是位数问题,python是64位而生成的DLL库文件是32位,不匹配。
- 说是编码问题,是ANSI和Unicode两种编码混淆,
- 还有说是调用方式出现问题,有stdcall和cdecl两种方式导致问题出现
- 尝试添加当前dll库路径:os.chdir(“E:\WorkSpace\BT\tool\Download\res”)
- 可能是DLL依赖其他库文件,需要将其他库文件添加当前目录。(如何寻找所依赖的dll库 网上搜索到)
四、最终的解决办法:
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 LoadDlllib = 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 应用程序。
- 如果是出现函数调用问题(stdcall和cdecl两种方式),应该不是找不到模块,而是找不到对应的函数,这里就用到了C++重载和C不支持重载以及extern “C”的东西,具体可以看笔者这篇文章。这种情况需要在dll库中的函数名声明时添加extern “C”修饰。
静态库(lib)与动态库(DLL)----函数重载的理解
笔者在调试的时候,尝试了一下,发现了这个情况。
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_intprint(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 LoadDlllib.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
五、其他相关问题:
笔者打开一个xxx_db.so,提示libc++_shared.so 找不到,然后就想到需要看一下哪些库缺少,使用objdump
然后将笔者需要找到编译器编译时所需要的库,对应的其编译器版本的库
然后需要放到对应的库的目录下面,比如lib64目录等。
之后又碰到问题,笔者直接在python环境下导入xxx_db.so,发现还是不行,报如下错误:Pyinit_xxx_db 里面没有定义导出函数
咨询同事发现,原来不是所有的动态库都可以被导入,只有定义了初始化的函数才可以,所以只能通过ctype.CDLL导入,所以后续就可以使用了。
Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。相关推荐
- python打包不能在其他电脑打开、找不到指定模块,pyinstaller打包移植到别的电脑报错OSError: [WinError 126] 找不到指定的模块。...
首先说一下我的环境 win10 python3.6.4 下面是我安装库 版本 pip list Package Version --------------- ------------ ...
- OSError: [WinError 126] 找不到指定的模块/Could not find 'cudart64_90.dll'.
OSError: [WinError 126] 找不到指定的模块/Could not find 'cudart64_90.dll'. 原文:http://blog.csdn.net/wobeatit/ ...
- OSError: [WinError 126] 找不到指定的模块Errorloading“torch\lib\caffe2_nvrtc.dll“ or one of its dependencies.
import torch x = torch.empty(5, 3) print(x) 报错 D:\Anaconda\anaconda3\python.exe D:/Python1自学/pythonP ...
- 解决Pytorch:raise err OSError: [WinError 126] 找不到指定的模块caffe2_detectron_ops.dll” or one of its dependen
解决Pytorch:raise err OSError: [WinError 126] 找不到指定的模块 caffe2_detectron_ops.dll" or one of its de ...
- OSError: [WinError 126] 找不到指定的模块
python调用动态库: OSError: [WinError 126] 找不到指定的模块 解决方法:把当前目录添加到系统中: 要添加目标文件的父目录: current_dir结尾不带'/',注意,后 ...
- OSError: [WinError 126] 找不到指定的模块————Shapely
问题 OSError: [WinError 126] 找不到指定的模块----Shapely pip install shapely之后,跑程序报错误,错误如下:import shapely 没问题, ...
- OSError: [WinError 126] 找不到指定的模块。【专治疑难杂症】
OSError: [WinError 126] 找不到指定的模块. Error loading "D:\xxxxxxx\lib\site-packages\torch\lib\asmjit. ...
- OSError: [WinError 126] 找不到指定的模块。
OSError: [WinError 126] 找不到指定的模块. 参考博客:https://www.pianshen.com/article/90841683243/ 环境:Win10+Anacon ...
- 完美解决 OSError: [WinError 126] 找不到指定的模块
OSError: [WinError 126] 找不到指定的模块 问题: 遇到这个问题 大多数都是 缺少了 dll 今天在python中遇到了 OSError: [WinError 126] 找不到指 ...
最新文章
- 随机查询N条记录MySQL、SQLServer、Oracle、postgreSQL
- 带android小绿人的屏保相册,盘点:那些年我们追过的Android
- 科普 | 你必须了解的漏洞利用缓解及对抗技术
- Lesson 1:单线程 Socket Communications(一)
- 关于PHP默认Expires: Thu, 19 Nov 1981...的故事
- python有什么隐藏功能_Python的隐藏功能
- 洛谷T1967 货车运输 Kruskal最大生成树倍增LCA
- 关于flashdevelop测试flex项目时trace不出的解决方法
- 为sakai配置单点登录
- FIT2CLOUD飞致云旗下多云管理平台完成华为FusionCompute兼容性测试
- 51单片机led灯依次点亮
- 服务器上的word文件被锁定,Microsoft Word忽略从WebDAV服务器发送的锁定状态
- 如何手动启动消防广播_消防应急广播应如何规范设置?
- 【蓝桥杯题目分析】2014年第五届——第二题:切面条
- 【银河麒麟】终端安装微信代码
- Android做3D旋转动画,Android编程实现3D旋转效果实例
- 什么是SOA?为什么要SOA?
- Mysql数据库计算时间差(天,时,分,秒)
- 使用爬虫获取四川省各市的降雨量
- 总结DES、3DES、AES、SM加密算法