在C程序中调用Python函数
我有一个用C语言写的应用程序,后来我需要解决一个非线性优化问题。可惜的是,按照我所知道的,C语言在这方面的资源非常有限(如果你知道有什么好的资源,请告诉我)。不过在Python中,这个问题解决起来就简单多了,比如可以使用scipy.optimize.minimize这个库。
在我尝试这样做的时候,遇到了一些常见的问题,比如找不到Python.h
这个文件、模块无法加载、调用函数时出现段错误等等。
那么,有什么简单快捷的方法可以让这两个程序连接起来呢?
1 个回答
11
要让这个工作顺利进行,有几个事情你需要确认一下:
- 确保你已经安装了Python(可能还需要安装
python-dev
这个包)。 - 找到你的
Python.h
文件,比如可以通过locate Python.h
来查找。这个文件应该在include
文件夹的某个子文件夹里,路径大概是../include/python2.7/Python.h
这样的。 - 在你的C代码中插入
#include “<path_to_Python.h>"
,这样你就可以使用Python的API了。 可以参考任何教程来调用你的Python函数。我用的是这个教程,效果不错。不过有几个小细节需要注意:
每次使用
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
文件吗?在编译时,使用-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版本进行调整)。
- 还记得之前用的
现在你应该能够成功编译并运行你的C程序,同时调用里面的Python程序了。
希望这些信息对你有帮助,祝你好运!
来源:
- 如何从C代码调用Python代码?
- 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无法加载模块
- 是什么设置了Python的sys.path,什么时候设置的?
- http://linux.die.net/man/1/gcc
- 调用函数时PyObject出现段错误
- 我在Ubuntu系统上有Python,但gcc找不到Python.h
- 如何从C代码调用Python代码?