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] 找不到指定的模块。相关推荐

  1. python打包不能在其他电脑打开、找不到指定模块,pyinstaller打包移植到别的电脑报错OSError: [WinError 126] 找不到指定的模块。...

    首先说一下我的环境 win10 python3.6.4 下面是我安装库 版本 pip list Package         Version --------------- ------------ ...

  2. OSError: [WinError 126] 找不到指定的模块/Could not find 'cudart64_90.dll'.

    OSError: [WinError 126] 找不到指定的模块/Could not find 'cudart64_90.dll'. 原文:http://blog.csdn.net/wobeatit/ ...

  3. 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 ...

  4. 解决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 ...

  5. OSError: [WinError 126] 找不到指定的模块

    python调用动态库: OSError: [WinError 126] 找不到指定的模块 解决方法:把当前目录添加到系统中: 要添加目标文件的父目录: current_dir结尾不带'/',注意,后 ...

  6. OSError: [WinError 126] 找不到指定的模块————Shapely

    问题 OSError: [WinError 126] 找不到指定的模块----Shapely pip install shapely之后,跑程序报错误,错误如下:import shapely 没问题, ...

  7. OSError: [WinError 126] 找不到指定的模块。【专治疑难杂症】

    OSError: [WinError 126] 找不到指定的模块. Error loading "D:\xxxxxxx\lib\site-packages\torch\lib\asmjit. ...

  8. OSError: [WinError 126] 找不到指定的模块。

    OSError: [WinError 126] 找不到指定的模块. 参考博客:https://www.pianshen.com/article/90841683243/ 环境:Win10+Anacon ...

  9. 完美解决 OSError: [WinError 126] 找不到指定的模块

    OSError: [WinError 126] 找不到指定的模块 问题: 遇到这个问题 大多数都是 缺少了 dll 今天在python中遇到了 OSError: [WinError 126] 找不到指 ...

最新文章

  1. 随机查询N条记录MySQL、SQLServer、Oracle、postgreSQL
  2. 带android小绿人的屏保相册,盘点:那些年我们追过的Android
  3. 科普 | 你必须了解的漏洞利用缓解及对抗技术
  4. Lesson 1:单线程 Socket Communications(一)
  5. 关于PHP默认Expires: Thu, 19 Nov 1981...的故事
  6. python有什么隐藏功能_Python的隐藏功能
  7. 洛谷T1967 货车运输 Kruskal最大生成树倍增LCA
  8. 关于flashdevelop测试flex项目时trace不出的解决方法
  9. 为sakai配置单点登录
  10. FIT2CLOUD飞致云旗下多云管理平台完成华为FusionCompute兼容性测试
  11. 51单片机led灯依次点亮
  12. 服务器上的word文件被锁定,Microsoft Word忽略从WebDAV服务器发送的锁定状态
  13. 如何手动启动消防广播_消防应急广播应如何规范设置?
  14. 【蓝桥杯题目分析】2014年第五届——第二题:切面条
  15. 【银河麒麟】终端安装微信代码
  16. Android做3D旋转动画,Android编程实现3D旋转效果实例
  17. 什么是SOA?为什么要SOA?
  18. Mysql数据库计算时间差(天,时,分,秒)
  19. 使用爬虫获取四川省各市的降雨量
  20. 总结DES、3DES、AES、SM加密算法

热门文章

  1. JSON格式简介及一些对应函数
  2. 空之轨迹手游服务器维护,《空之轨迹》手游今日全平台公测 重拾热血与感动...
  3. 进程和应用程序的区别(简单理解)
  4. 华为Watch Buds耳机会防水吗?防水等级是多少?
  5. lnmp环境搭建的详细过程(ubuntu22)
  6. 计算机主机光驱弹不出来,电脑光驱弹不出来如何解决
  7. 成为职场说话高手的技巧
  8. GeoServer源码解析和扩展 (三)结构篇
  9. 机器人学Robotics学习资料 | 我的SLAM入门路线分享
  10. Python小游戏:贪吃蛇——turtle的使用