【问题标题】:Using SWIG to interface large C-project with Python使用 SWIG 将大型 C 项目与 Python 接口
【发布时间】:2014-02-23 19:19:52
【问题描述】:

我想从 Python 的大型 C 项目中访问一些函数。在我看来,SWIG 是要走的路。我不太习惯于编写 i C 语言,我对“make”的体验主要来自下载源代码 tar。我想要访问的函数位于一个大型 C 项目 (Gnuplot) 中,我不知道在如此大量的源文件上使用 SWIG 的人。我要访问的函数都在一个 c 文件中,但有许多递归包含。我想要一些关于如何开始的建议。

我要访问的内容:term/emf.trm

原因:在 matplotlib 的 EMF 后端中缺少对符号和 LaTex 的支持(此后端甚至已从 matplotlib 中删除)。我在工作中被旧版本的 Word 困住了,没有 EMF 就无法在这个程序中获得适合我目的的绘图。我可以使用 Gnuplot 代替 matplotlib,但许多绘图是专门用于特定目的的,而且 matplotlib 比 Gnuplot 更容易使用。

任何建议将不胜感激。

【问题讨论】:

    标签: python matplotlib gnuplot swig


    【解决方案1】:

    你可以试试Gnuplot.py

    还有:

    不久前,我使用 SWIG 将 Wild Magic C++ 库(100K+ 行代码)打包到 Python 模块中(看看 Python Wild Magic。)

    由于代码库包含 1000 多个 C++ 类,我使用 GCC-XML 帮助我生成了 99% 的 SWIG 接口文件。基本上是这样的:

    1. 对所有头文件运行 gcc-xml,生成 XML 输出
    2. 通过解析 XML 获取所有名称(函数和类)的列表
    3. 在空运行模式下运行 make,即make -n 并捕获输出。
    4. 解析输出以获得所有定义文件的列表(.c.cpp 或你有什么)按编译顺序。顺序很重要,因为 SWIG 需要按依赖顺序进行接口声明。
    5. 从上一步中解析有序的定义文件并 grep 所有#include 语句。除非重复,否则这些有序的 #include 可以添加到您的 SWIG 接口文件中。

    听起来您只对几个函数感兴趣,而不是包装整个库,所以这可能是一种矫枉过正。你正在使用 C 和 Fortran,所以它有点不同。但也许您会发现这种方法很有用。

    这对于 Wild Magic 来说很容易做到,因为目录结构非常平坦。 Gnuplot 看起来更加模块化。

    【讨论】:

    • 我不想切换到 Gnuplot.py,因为我已经投入了大量时间来制作自定义绘图(不仅仅是曲线)。这将是我最后的手段。 Matplotlib 在我看来要好得多,将 EMF-supprt 添加到 Matplotlib 比重做所有代码更好。
    • 我明白了。我在答案中添加了一个示例 SWIG 项目——您可能会发现它很有用。
    • +1 用于建议 SWIG 和 gcc-xml。想知道您是否可以扩展您如何使用 gcc-xml 输出。
    • 当然,我用 gcc-xml 添加了对我的方法的高级描述。
    • 我不确定这是否矫枉过正。我目前正在考虑将 Gnuplot 的终端用于 Matplotlib,然后能够使用 Gnuplot、Matplotlib 或两者(在同一个绘图函数中)并将其全部输出到 Gnuplot 的某些终端上会很好。目前在我的视野范围内,但我会尽可能地做到这一点。感谢您的帮助!
    【解决方案2】:

    你应该从阅读 swig 手册的前几章开始,并为 python 制作一些示例项目,distrib 有很多说明 swig 的许多不同功能,并且 make 文件已经构建,所以要学习的东西更少.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多