在Python中调用C函数
我有很多用C编写的函数,我希望用Python编写的代码能够访问这些函数 我在这里读了几个关于类似问题的问题(例如),但我不知道我需要采取哪种方法 一个问题推荐ctypes,另一个问题推荐cython。我已经阅读了这两个方面的一些文档,我完全不清楚哪一个更适合我在Python中调用C函数,python,c,ctypes,cython,Python,C,Ctypes,Cython,我有很多用C编写的函数,我希望用Python编写的代码能够访问这些函数 我在这里读了几个关于类似问题的问题(例如),但我不知道我需要采取哪种方法 一个问题推荐ctypes,另一个问题推荐cython。我已经阅读了这两个方面的一些文档,我完全不清楚哪一个更适合我 基本上,我已经编写了一些python代码来执行一些二维FFT,我希望C代码能够看到结果,然后通过我编写的各种C函数对其进行处理。我不知道从C调用Python是否更容易,反之亦然。从Python调用C会更容易。您的场景听起来很奇怪-通常人们
基本上,我已经编写了一些python代码来执行一些二维FFT,我希望C代码能够看到结果,然后通过我编写的各种C函数对其进行处理。我不知道从C调用Python是否更容易,反之亦然。从Python调用C会更容易。您的场景听起来很奇怪-通常人们用python编写大多数代码,除了处理器密集型部分(用C编写)之外。二维FFT是代码中计算密集型的部分吗?您应该通过编写ctypes包装器从python调用C。Cython是为了使类似python的代码运行得更快,ctypes是为了使C函数可以从python调用。您需要执行以下操作:
如果我理解得很好,您不喜欢以c=>python或类似python=>c的方式进行对话。 在这种情况下,我建议您使用
Cython
。它可以进行多种操作,特别是在您的例子中,调用从C用Python编写的函数
下面是它的工作原理():
下面的示例假设您有一个Python类(self
是它的一个实例),并且这个类有一个方法(namemethod
),您希望调用这个类并处理来自C的结果(这里是一个double
),用Cython分机编写的
将帮助您完成此呼叫
cdef public api double cy_call_func_double(object self, char* method, bint *error):
if (hasattr(self, method)):
error[0] = 0
return getattr(self, method)();
else:
error[0] = 1
在C端,您将能够执行如下调用:
PyObject *py_obj = ....
...
if (py_obj) {
int error;
double result;
result = cy_call_func_double(py_obj, (char*)"initSimulation", &error);
cout << "Do something with the result : " << result << endl;
}
PyObject*py_obj=。。。。
...
if(py_obj){
整数误差;
双重结果;
结果=cy_call_func_double(py_obj,(char*)“initSimulation”,&error);
好吧,这里你指的是下面两件事
如何从python中调用c函数(扩展python)
如何从C程序调用python函数/脚本(嵌入python)
For#2即“嵌入Python”
您可以使用以下代码段:
#include "python.h"
int main(int argc, char *argv[]) {
Py_SetProgramName(argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print 'Today is',ctime(time())\n");
/*Or if you want to run python file within from the C code*/
//pyRun_SimpleFile("Filename");
Py_Finalize();
return 0; }
For#1即“扩展Python”
那么最好的选择就是使用Ctypes(顺便说一句,它可以跨python的所有变体移植)
从ctypes导入*
libc=cdll.msvcrt
打印自由时间(无)
1438069008
printf=libc.printf
printf(“你好,%s\n”,“世界!”)
你好,世界!
十四,
printf(“%d瓶啤酒\n”,42)
42瓶啤酒
十九,
对于详细的指南,您可能想参考:您有库吗?.so?共享库?g++-Shared-Wl,-soname,mylib.so-o mylib.so-my.o?这是计算强度最低的部分…结果是,用Python编写代码比用C编写代码方便得多。我希望为函数编写包装器更快用C重新编写整个过程。鉴于OP是C和Python代码的作者,OP更喜欢编写Python代码,这里不清楚应该使用什么。Cython允许从C.+1中提取更多代码进行相关注释。Cython不仅仅是性能问题。它是一个复杂而强大的工具。它允许您将C代码与th python代码,因此如果您碰巧用C编写代码,它可以成为C和python之间的完美桥梁。也就是说,您可以将静态(强类型变量)与动态类型变量混合。并从C(PyObject
)表示形式切换到python(object
)通过一个简单的cast
表示,两种方式都有。链接处的教程非常好,但我必须将int-sum
更改为int-sum=0
,才能正常工作。@Akavall谢谢,修复了。谢谢教程链接-非常好。我唯一要更改的是“基础”部分中Python函数的名称ON,因为您已经过载了“Url函数”,这可能有点混乱。谢谢!看起来我在C中可以用同样的工作量来做,所以在这种情况下我不需要使用Cython。但是我怀疑我将来会发现这个信息非常有用。这是C还是C++?<代码> Cuth<代码>是不是?