- extending: python 调用 c/c++
- embedding: c/c++ 调用 python
extending 有很多种工具(阅读 programming python)
- swig: 为 c/c++ 代码提供许多语言的接口,不仅仅是python;swig 不支持某些C++特性
- sip
- boost.python: 编译后 module 还需要依赖 boost dll
推荐使用 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!
过程
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:
Post a Comment