Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中调用C函数_Python_C_Ctypes_Cython - Fatal编程技术网

在Python中调用C函数

在Python中调用C函数,python,c,ctypes,cython,Python,C,Ctypes,Cython,我有很多用C编写的函数,我希望用Python编写的代码能够访问这些函数 我在这里读了几个关于类似问题的问题(例如),但我不知道我需要采取哪种方法 一个问题推荐ctypes,另一个问题推荐cython。我已经阅读了这两个方面的一些文档,我完全不清楚哪一个更适合我 基本上,我已经编写了一些python代码来执行一些二维FFT,我希望C代码能够看到结果,然后通过我编写的各种C函数对其进行处理。我不知道从C调用Python是否更容易,反之亦然。从Python调用C会更容易。您的场景听起来很奇怪-通常人们

我有很多用C编写的函数,我希望用Python编写的代码能够访问这些函数

我在这里读了几个关于类似问题的问题(例如),但我不知道我需要采取哪种方法

一个问题推荐ctypes,另一个问题推荐cython。我已经阅读了这两个方面的一些文档,我完全不清楚哪一个更适合我


基本上,我已经编写了一些python代码来执行一些二维FFT,我希望C代码能够看到结果,然后通过我编写的各种C函数对其进行处理。我不知道从C调用Python是否更容易,反之亦然。

从Python调用C会更容易。您的场景听起来很奇怪-通常人们用python编写大多数代码,除了处理器密集型部分(用C编写)之外。二维FFT是代码中计算密集型的部分吗?

您应该通过编写ctypes包装器从python调用C。Cython是为了使类似python的代码运行得更快,ctypes是为了使C函数可以从python调用。您需要执行以下操作:

  • 编写要使用的C函数。(你可能已经这么做了)
  • 为这些函数创建共享对象(.so,适用于linux、os x等)或动态加载的库(.dll,适用于windows)。(也许你也已经这么做了)
  • 编写ctypes包装器(比听起来容易多了,)
  • 在Python中从该包装器调用函数。(这与调用任何其他python函数一样简单)

  • 如果我理解得很好,您不喜欢以c=>python或类似python=>c的方式进行对话。 在这种情况下,我建议您使用
    Cython
    。它可以进行多种操作,特别是在您的例子中,调用从C用Python编写的函数

    下面是它的工作原理():

    下面的示例假设您有一个Python类(
    self
    是它的一个实例),并且这个类有一个方法(name
    method
    ),您希望调用这个类并处理来自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<代码>是不是?