如何将c ++和Python与SWIG集成

时间:2011-07-09 19:32:51

标签: c++ python django linux

  

可能重复:
  Integrate Python And C++

我是python GUY并在django中做网络内容。我想知道使用SWIG集成python和C ++是多么容易或多难。

是否有效/容易做或应该离开C ++并在python中编写代码。

过去的程序员已经编译了一些C ++文件。我知道SWIG用于集成语言,但我不知道使用它有什么实际意义或问题。

或者没有使用它,在Python中重写代码是更好的选择。

3 个答案:

答案 0 :(得分:6)

使用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()

答案 1 :(得分:3)

我经常使用swig工作,以便将代码翻译成多种语言,这是一个非常有用的工具。

为了了解什么是最适合您的方法,您应该观察您的软件界面。如果c ++类只有接收和返回简单类型(如字符串或stl结构)的方法,那么您可以确信您的代码没有“被唤醒”的问题。当你有复杂的接口时,问题就出现了。

python的另一个问题是GIL的存在,在多线程环境中(在c ++端使用阻塞调用)可能会导致很多问题并涉及复杂的管理(在c ++代码中使用python-dev库)。 / p>

如果您的目标代码仅以python编写,那么建议您看一下boost-python库,这些库更专业,通常更易于使用python。但是,多线程环境的问题仍然存在。

答案 2 :(得分:2)

如何使用SWIG连接python和C ++。 (脸颊)

  • 生成代表某些C ++标头的.i文件。即使SWIG解析(尝试解析)您的头文件,它仍然需要一个swig接口文件来告诉swig要导入的内容。
  • 解决方案:简单!告诉您的一个项目成员编写一个生成.i文件的C ++头文件解析器。
  • 接下来对该.i文件运行swig。
  • 然后看着它失败。
  • 编辑头文件并在SWIG不理解的代码周围插入#ifndef SWIG ... #endif。
  • 冲洗并重复。
  • 一旦工作,请将您的50行c ++标题文件气球放入5000+行swig .cpp文件和一个稍小的.py文件中。
  • 对要包装的所有头文件执行相同的操作。
  • 使用python可调用的钩子编译新的和改进的C ++应用程序。
  • 去吃午饭。编译和链接不会很快完成。