从 C 程序中调用 Python 函数

Posted

技术标签:

【中文标题】从 C 程序中调用 Python 函数【英文标题】:Call a Python function from within a C program 【发布时间】:2014-08-14 19:52:02 【问题描述】:

我有一个 C 语言应用程序,有时我需要解决一个非线性优化问题。不幸的是,AFAIK 在 C 中做这件事的资源非常有限(请另外告诉我)。然而,在 Python 中做到这一点非常简单,例如scipy.optimize.minimize。

当我尝试这样做时,我遇到了一些似乎很常见的陷阱,例如Python.h未找到、模块未加载、函数调用分段错误等

初学者有什么方法可以快速简单地链接这两个程序?

【问题讨论】:

【参考方案1】:

为了完成这项工作,您必须确保一些事情已经到位:

    确保您已安装 Python(您可能需要 python-dev 包)。 找到您的 Python.h 文件,例如通过locate Python.h。其中一个事件应位于include 文件夹中的子(子)文件夹中,例如路径应该类似于../include/python2.7/Python.h。 在您的 C 代码中插入 #include “<path_to_Python.h>" 以便能够使用 Python API。

    使用任何教程来调用您的 Python 函数。我使用了this one,它成功了。然而,有几个小点缺失:

    每当您使用任何 Py<Name> 函数时,例如PyImport_Import()总是检查结果以确保没有错误,例如

    // Load the module object
    pModule = PyImport_Import(pName);
    
    if (!pModule)
    
        PyErr_Print();
        printf("ERROR in pModule\n");
        exit(1);
    
    

    在初始化 Python 解释器之后,即在 Py_Initialize(); 之后,您必须立即将当前路径附加到 sys.path 以便能够加载您的模块(假设它位于您的当前目录中):

    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyString_FromString("."));
    
    请记住,当您提供 Python 文件的名称时,它必须不带扩展名 .py。 最后,您必须在编译/链接期间执行以下操作: 还记得你之前使用的../include/python2.7/Python.h 文件吗?在编译期间在gcc 选项中使用-I 选项将include 文件夹包含在头文件目录列表中,例如-I /System/Library/Frameworks/Python.framework/Versions/2.7/include。 还将包含所需库的文件夹传递给链接器。它应该位于include 文件夹所在的同一文件夹中,例如-L /System/Library/Frameworks/Python.framework/Versions/2.7/lib,以及 -lpython2.7 选项(当然要根据您的 Python 版本进行相应调整)。

现在您必须能够成功编译和执行调用 Python 程序的 C 程序。

我希望这是有帮助的,祝你好运!

来源:

How do you call Python code from C code? http://www.linuxjournal.com/article/8497?page=0,1 http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I http://www.codeproject.com/Articles/11843/Embedding-Python-in-C-C-Part-II Python C API doesn't load module What sets up sys.path with Python, and when? http://linux.die.net/man/1/gcc PyObject segfault on function call I have Python on my Ubuntu system, but gcc can't find Python.h How do you call Python code from C code?

【讨论】:

以上是关于从 C 程序中调用 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章

通过 C API 从字符串创建和调用 python 函数

C程序怎样调用其它文件里的函数?

怎样从 C 中调用 FORTRAN (C++, BASIC, Pascal, Ada, LISP) 的函数?反之亦然?

Python中调用c语言

通过 ctypes 从 Python 调用的 C 函数返回不正确的值

从 cython c 调用 python 函数时的奇怪行为