[英]C to Python via Ctypes - Wrapping Struct of Function Pointers to Static Functions
[英]Wrapping c++ functions in python with ctypes on windows : function not found
我需要运行一系列python脚本来计算各种脚本,这些脚本工作正常,但其中一个运行速度很慢,必须用C ++完成。 C ++代码已准备就绪,但我需要找到一种从python调用C ++函数并获取返回值的方法。
我找到了有关SWIG的信息,但是没有让它在Windows上使用Visual Studio(我必须在Windows上的VS中执行它,因为其他限制)。 我发现使用标准输入和输出值的非常简单的函数更容易使用ctypes。
所以我用ctypes进行了很多测试,尝试了我在网上找到的所有例子,每次都会发生的事情是我可以加载dll(用visual studio 2012编译器构建),但是当我尝试在python中调用函数时,它只是:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print maLib.plop()
File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'plop' not found
python代码是(test.py):
from ctypes import cdll
lib = cdll.LoadLibrary('test')
print lib.plop()
C ++代码是(test.cpp,编译为test.dll,Visual Studio设置为构建为dll):
extern "C"
{
int plop();
}
int plop() { return 4; }
正如您所看到的,我试图让它尽可能简单,以避免细节使其失败。 我已经阅读了python ctypes帮助,以及如何使用ctypes的教程,尝试与它们完全相同的代码,但我不得不适应一点,因为我使用的是Visual Studio / windows,而其他大多数用户都在使用linux。 所有文件都在同一个文件夹中。
我尝试了多种加载库的方法:LoadLibrary('。/ name.dll'),WinDLL('name.dll'),给函数一个不同的名称,void返回类型等等......
你认为我应该使用SWIG吗? 我的问题是一个明显的初学者错误吗? 我是一名学生,对我正在使用的大部分内容都很陌生,但我在这方面付出了很多努力,即使我只需要它来完成一项特定的任务。 当使用SWIG时,我不得不用函数指针或引用创建一个包装器,所以我认为这是问题,这让我想尝试一个更简单的解决方案。
我正在使用:Python 2.7.7,Visual Studio 2012,Windows 8.1
提前谢谢了
Python报告的错误非常清楚。
函数'plop'未找到
这意味着DLL不会导出该名称的函数。 因此,您需要导出该功能。 使用.def文件或使用__declspec(dllexport)
:
extern "C"
{
__declspec(dllexport) int plop();
}
要检查DLL以调试此类问题,请使用dumpbin
或Dependency Walker。
请注意,由于未指定调用约定,因此使用缺省的__cdecl
。 这意味着cdll
在ctypes
方面是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.