Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318828
  • 博文数量: 60
  • 博客积分: 2781
  • 博客等级: 少校
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-23 16:42
文章分类

全部博文(60)

文章存档

2011年(33)

2010年(27)

分类: Python/Ruby

2011-03-28 11:55:12

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命令已可以使用(后面介绍用途)。

示例代码:

  1. # embed.py

  2. print 'Hello World'
  1. // useEmbed.cpp
  2. #include <Python.h>
  3. using namespace std;
  4. int main()
  5. {
  6.     Py_Initialize();
  7.     FILE *file = fopen("embed.py", "r+");
  8.     PyRun_SimpleFile(file,"embed.py");
  9.     Py_Finalize();
  10.     fclose(file);

  11.     return 0;
  12. }
此时编译 useEmbed.cpp 文件,编译的过程就用到了之前提到的 python-config 命令,因为这个编译过程不同于普通的C++编译,它需要链接很多有关Python的信息,我们可以通过python-config命令查看需要的链接信息。

  1. $ python-config --cflags --ldflags
  2. -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
  3. -lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic
可以看到选项--cflags和--ldflags输出了很多条目,这些条目我们在编译.cpp文件的时候都需要引用,为了避免手工输入,我们使用bash中的命令替换(command substitution)技巧,如下:

  1. gcc useEmbed.cpp $(python-config --cflags --ldflags) -o useEmbed

  2. OR

  3. gcc useEmbed.cpp `python-config --cflags --ldflags` -o useEmbed
编译成功,生成可执行文件useEmbed。

BTW:大家可以参考 Boost::python 类库,使得python和C++无缝衔接。
阅读(2069) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~