从 Python 调用自定义的 C++ dll
Posted
技术标签:
【中文标题】从 Python 调用自定义的 C++ dll【英文标题】:Calling customized C++ dll from Python 【发布时间】:2013-09-11 16:02:26 【问题描述】:我的 C++ IDE 是 Visual Studio 2012 Express 版本,我的 Python IDE 是 Aptana3(64 位)。我的电脑是 Windows 7 64 位。
我用 C++(Win32 控制台应用程序)编写了一个 .dll,它基本上遵循 MSDN 的说明。当我使用 C++ 应用程序调用它时,它运行良好。
然后我尝试通过以下代码从 Python 调用它:
import ctypes
d = ctypes.WinDLL("C:\\DynamicLibrary\\Debug\\MathFuncsDll.dll")
但是,我遇到了以下错误:
File "`<pyshell#8>`", line 1, in <module>
d = ctypes.WinDLL("C:\\DynamicLibrary\\Debug\\MathFuncsDll.dll")
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 193] %1 is not a valid Win32 application
我在 google 上搜索过这个错误信息,有些帖子说这是因为 32 位和 64 位之间的兼容性。但我对此表示怀疑,因为我的 IDE 和系统都是 64 位的。
我可以知道我错了吗?
提前非常感谢。 :)
【问题讨论】:
你考虑过使用 IronPython 吗? @Inspector 怎么样?如何从 IronPython 链接到本机 DLL?import clr; clr.AddReference(…)
@inspectorG4dget:如果本机代码的位数不匹配,使用IronPython
不会解决问题
@Inspector clr.AddReference 用于托管 DLL。这个是原生的。
【参考方案1】:
对该错误最常见的解释是系统试图将 32 位 DLL 加载到 64 位进程中,反之亦然。您的系统是 64 位的这一事实只会使诊断更有可能。也许您的 Python 是 64 位的,但 C++ 项目输出的是 32 位 DLL。反之亦然。
在您声明您的 Python 安装是 64 位的问题中。在这种情况下,您需要查看您的 C++ 项目。你的目标是什么平台? Win32 还是 x64?我的钱是在你的目标是 Win32 这个问题的答案上。
这是最可能的解释。除此之外,下一个最可能的原因是完全相同的问题,但是对于其中一个依赖项。 Python 进程和 DLL 匹配,但在解析 DLL 的依赖项时,加载程序会发现错误位数的 DLL。
【讨论】:
这是问题的正确答案。您能否通过添加 OP 如何使用dumpbin \headers
确定 dll 和 Python 安装的位数并查找 machine
的条目来放大?
@Abhijit 我不会这样做。提问者正在编译 DLL,因此只需要在 IDE 中检查目标平台。无需逆向工程。
可能是,但如果有疑问,我首先检查是否存在位不匹配。这在使用第三方 dll 时很有帮助。无论如何,我已经添加了自己的答案
这可能会有所帮助:64-bit C++ Development Under Visual Studio 2012 Express
@DavidHeffernan 嗨,大卫,感谢您的回答。我的目标是 Win 64 平台。我的计划是编写一系列 C++ .dll 并从 Python 调用它们。【参考方案2】:
我在 google 上搜索过这个错误信息,有些帖子说是因为 32 位和 64 位之间的兼容性。但我对此表示怀疑,因为我的 IDE 和系统都是 64 位的。
是的,你的研究是正确的。
我的 C++ IDE 是 Visual Studio 2012 Express 版本, 我的电脑是 Windows 7 64 位。
这并不能保证您会构建 64 位二进制文件。事实上,VS 2012 IDE 是一个 32 位应用程序。它的编译器和负责生成 64 位二进制文件的 CRT。而且 Visual Studio 的默认设置是生成 32 位二进制文件
您可以轻松地通过 Google 搜索并确定如何使用 Visual Studio 构建 64 位二进制文件。或者,参考链接How to: Configure Visual C++ Projects to Target 64-Bit Platforms
我的 Python IDE 是 Aptana3(64 位)。我的电脑是 Windows 7 64 位。
这仍然没有说明您的 Python 安装位数。
如有疑问,请检查dll
和python.exe
的位数。您可以使用dumpbin
轻松确定位数
C:\Python27>dumpbin /headers python.exe|grep "machine"
14C machine (x86)
【讨论】:
我尝试在配置管理器中将 VS2012 更改为 Win32,但是仍然出现同样的错误。【参考方案3】:将您的 C 代码构建为 X64 版本
我测试了它,实际上效果很好
【讨论】:
以上是关于从 Python 调用自定义的 C++ dll的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Visual Studio 2017 和 boost 构建的 python 中加载自定义 dll 时出现依赖错误