【发布时间】:2011-10-01 23:52:49
【问题描述】:
我是 python GUY,在 django 中做网络工作。我想知道使用 SWIG 集成 python 和 C++ 的难易程度。
这样做是否高效/容易,还是应该离开 C++ 并在 python 中编写代码。
过去的程序员已经对 C++ 文件中的某些内容进行了编码。我知道 SWIG 用于集成语言,但我不知道使用它有什么实际意义或问题。
或者没有用,用 Python 重写代码是更好的选择。
【问题讨论】:
我是 python GUY,在 django 中做网络工作。我想知道使用 SWIG 集成 python 和 C++ 的难易程度。
这样做是否高效/容易,还是应该离开 C++ 并在 python 中编写代码。
过去的程序员已经对 C++ 文件中的某些内容进行了编码。我知道 SWIG 用于集成语言,但我不知道使用它有什么实际意义或问题。
或者没有用,用 Python 重写代码是更好的选择。
【问题讨论】:
使用 swig 简单。通常比人们想象的要容易。 见http://www.swig.org/tutorial.html。
基本上你只需要编写一个接口文件*.i,其中只包含你需要的头文件。
example.i :
%module example
%{
/* Includes the header in the wrapper code */
#include "header.h"
%}
/* Parse the header file to generate wrappers */
%include "header.h"
然后使用 SWIG 生成包装器。用你的 c++ 代码编译它,你就完成了:
$ swig -python example.i
$ g++ -c example.cc example_wrap.cc \
-I/usr/local/include/python2.1
$ ld -shared example.o example_wrap.o -o _example.so
你得到了你的 python 模块。
>>> import example
>>> example.foo()
【讨论】:
我经常在工作中使用 swig 来将代码翻译成多种语言,它是一个非常有用的工具。
为了了解什么是最适合您的方式,您应该观察您的软件界面。如果您的 c++ 类具有仅接收和返回简单类型(如字符串或 stl 结构)的方法,则您可以确信您的代码没有被“swigged”的问题。当您有复杂的接口时,问题就会出现。
python 的另一个问题是 GIL 的存在,它在多线程环境中(在 c++ 端具有阻塞调用)会导致很多问题并涉及复杂的管理(在 c++ 代码中使用 python-dev 库)。
如果您的目标代码仅用 python 编写,建议查看 boost-python 库,这些库更专业,通常更易于与 python 一起使用。然而,多线程环境的问题仍然存在。
【讨论】:
如何使用 SWIG 连接 python 和 C++。 (舌尖上)
【讨论】: