Python提供了与C进行交互的API接口,至于如何写Python扩展请参考Python文档,今天试验了在C++代码中嵌入Python,做个总结:
环境:Linux Fedora 14,至于在Windows7下面的配置以后再看吧。
利用Python的C/API接口就需要用到Python的开发包,Fedora14默认没有带此开发包,所以yum install python-devel,此时会发现/usr/include/python/里面多出了许多头文件,而且python-config命令已可以使用(后面介绍用途)。
示例代码:
- # embed.py
-
-
print 'Hello World'
- // useEmbed.cpp
-
#include <Python.h>
-
using namespace std;
-
int main()
-
{
-
Py_Initialize();
-
FILE *file = fopen("embed.py", "r+");
-
PyRun_SimpleFile(file,"embed.py");
-
Py_Finalize();
-
fclose(file);
-
-
return 0;
-
}
此时编译 useEmbed.cpp 文件,编译的过程就用到了之前提到的 python-config 命令,因为这个编译过程不同于普通的C++编译,它需要链接很多有关Python的信息,我们可以通过python-config命令查看需要的链接信息。
- $ python-config --cflags --ldflags
-
-
-I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -fPIC -fwrapv
-
-lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic
可以看到选项--cflags和--ldflags输出了很多条目,这些条目我们在编译.cpp文件的时候都需要引用,为了避免手工输入,我们使用bash中的命令替换(command substitution)技巧,如下:
- gcc useEmbed.cpp $(python-config --cflags --ldflags) -o useEmbed
-
-
OR
-
-
gcc useEmbed.cpp `python-config --cflags --ldflags` -o useEmbed
编译成功,生成可执行文件useEmbed。
BTW:大家可以参考 Boost::python 类库,使得python和C++无缝衔接。
阅读(2069) | 评论(0) | 转发(0) |