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

How Can i integrate c++ and Python with SWIG

本文关键字:Python SWIG 集成 c++      更新时间:2023-10-16

可能重复:
集成Python和C++

我是巨蟒GUY,在django做网络工作。我想知道使用SWIG集成python和C++有多难。

它是高效/容易做到的,还是应该离开C++,用python来编写代码。

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

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

使用swig很容易。通常比人们想象的要容易。看见http://www.swig.org/tutorial.html.

基本上,您只需要编写一个接口文件*.i,其中只包含您需要的头
示例.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开发库(。

如果你的目标代码只用python编写,建议你看看boost python库,因为它们更专业,通常更容易与python一起使用。然而,多线程环境的问题仍然存在。

如何使用SWIG接口python和C++。(开玩笑(

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