【问题标题】:How Can i integrate c++ and Python with SWIG [duplicate]我如何将 c++ 和 Python 与 SWIG 集成 [重复]
【发布时间】:2011-10-01 23:52:49
【问题描述】:

可能重复:
Integrate Python And C++

我是 python GUY,在 django 中做网络工作。我想知道使用 SWIG 集成 python 和 C++ 的难易程度。

这样做是否高效/容易,还是应该离开 C++ 并在 python 中编写代码。

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

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

【问题讨论】:

    标签: c++ python django linux


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我经常在工作中使用 swig 来将代码翻译成多种语言,它是一个非常有用的工具。

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

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

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

      【讨论】:

      • 我需要将 C++ 类与我的 django 集成,SWIG 也可以在那里工作
      • django 是一个 python 库。您的问题(如果有问题)来自 C++ 代码。如果您在 django 中使用此 C++ 代码,那么您肯定没有阻塞代码。我认为它应该可以工作,复杂性取决于您的 C++ 接口。
      【解决方案3】:

      如何使用 SWIG 连接 python 和 C++。 (舌尖上)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 2022-09-28
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多