Call a Python function from within a C program
我在C中有一个应用程序,在某些时候我需要解决非线性优化问题。 不幸的是,AFAIK在C中的资源非常有限(请让我知道其他情况)。 但是在Python中使用它很简单,例如scipy.optimize.minimize。
当我试图这样做时,我遇到了一些似乎非常频繁的陷阱,例如
什么是快速简便的第一计时器链接这两个程序的方式?
为了使这项工作有一些你必须确保到位的东西:
使用任何教程来调用Python函数。我用过这个,它就是诀窍。然而,有几个小点缺失:
-
无论何时使用任何
Py 函数,例如PyImport_Import() ,始终检查结果以确保没有错误,例如1
2
3
4
5
6
7
8
9
10// Load the module object
pModule = PyImport_Import(pName);
if (!pModule)
{
PyErr_Print();
printf("ERROR in pModule
");
exit(1);
} -
在初始化Python解释器之后,即在
Py_Initialize(); 之后,您必须将当前路径追加到sys.path 以便能够加载模块(假设它位于当前目录中):1
2
3PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys,"path");
PyList_Append(path, PyString_FromString("."));
-
还记得以前用过的
../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版本调整它)。
现在你必须能够成功编译和执行你的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代码?