Jun 3, 2010

mix python and C/C++

  • extending: python 调用 c/c++
  • embedding: c/c++ 调用 python

extending 有很多种工具(阅读 programming python)
  1. swig: 为 c/c++ 代码提供许多语言的接口,不仅仅是python;swig 不支持某些C++特性
  2. sip
  3. boost.python: 编译后 module 还需要依赖 boost dll
Good practice
推荐使用 swig,如果有问题试试 boost.python

swig 不支持
Overloaded methods and functions
Overloaded operators
Namespaces

Dave's snide remark: Like a large bottle of strong Tequilla, it's better to use C++ in moderation.

swig

windows 用 visual c++,因为python是用VC编译的,不支持mingw
下载 windows版本,内含例子。
设置系统变量
PYTHON_INCLUDE : c:\Python27\include
PYTHON_LIB : c:\Python27\libs\python27.lib
swig.exe -c++ -python example.i
建立vc dll empty project,加入 c/c++ 文件(包括swig 生成的 wrap cxx 文件)
加入 include dir: $(PYTHON_INCLUDE)
lib: $(PYTHON_LIB)
编译
把生成的dll改名为 _example.pyd
Done!
找到任何一个例子,如 swigwin-2.0.4\Examples\python\class;打开 .dsp 文件,编译即可

过程
swig 编译 exampel.i 生成 example_warp.cxx 和 example.py
VC 编译 example.cxx 生成 example.o
编译 example_wrap.cxx 生成 example_wrap.o
生成 _example.pyd

最后生成的module是两个文件
example.py
_example.pyd
缺一不可

使用:
import example

优点:
.pyd 只依赖于 python27.dll 和 windows系统dll
swig 附带很多例子,并且生成不同语言的接口(python, c#, java, perl, ruby)只需修改系统变量,找到对象的例子就可以了

boost.python

boost.python  是 boost 的一个部分
编译 boost.python
如果 Python 默认设置,那在编译 boost.python 时一般不会有错误。如果出现
No python installation configured and autoconfiguration failed
那就是找不到Python
解决办法,参见说明
create user-config.jam in your home directory

注:Windows下python 只支持 toolset=msvc,不支持gcc。除非你下载的Python是mingw编译的。所以不能编译mingw版的boost.python
使用 boost.python
visual c++
除了需要 boost include/lib/dll 外
将 C:\Python27\include 加入 include
将 c:\Python27\libs 加入 lib

例子:boost\libs\python\example\quickstart
直接使用visual c++ 编译extending.cpp即可
编译成 dll,将dll后缀改名为 pyd,则直接可以调用
注意 pyd 文件的名字和 BOOST_PYTHON_MODULE 的名字应相同
用 dependency walker 查看 .pyd,可以看到它依赖于 python27.dll (以 python 2.7 为例),以及boost_python-vc90-mt-1_45.dll 这是 boost.python 的一个缺点,它依赖于 boost_python-vc90-mt-1_45.dll 如果你要发布.pyd,必须附带 boost_python-vc90-mt-1_45.dll,而boost_python-vc90-mt-1_45.dll又可能依赖其他dll,nightmare

0 comments: