从 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 中调用 FORTRAN (C++, BASIC, Pascal, Ada, LISP) 的函数?反之亦然?