【问题标题】:Combined Python & Ruby extension module结合 Python 和 Ruby 扩展模块
【发布时间】:2009-02-04 13:42:04
【问题描述】:

我有一个 Python 的 C 扩展模块,我想让 Rubyists 可以使用它。

源代码有许多 C 模块,只有一个依赖于 Python。其余的仅依赖于彼此和标准库。我可以用python setup.py build 以通常的方式构建它。

我一直在尝试使用 newgem 添加 Ruby 支持,我可以使用 rake gem 构建扩展版本。然而,合并后的源代码有一个丑陋的目录布局(混合了 Gem 风格和 Setuptools 风格的结构),并且构建过程很杂乱。

我不能只将所有源代码保存在同一个目录中,因为mkmf 会自动选择依赖 Python 的模块并尝试构建它,而用户不必安装 Python 来编译一个不会'不能使用。我目前的技巧是让extconf.rb 将独立于 Python 的源文件复制到与依赖于 Ruby 的扩展模块相同的目录中。

有没有更明智的方法让代码对两种语言都可用?我应该在单独的 Gem 中复制与 Python 无关的代码吗?我应该将独立代码作为使用 autotools 构建的单独库发布吗?是否有可以跳过不需要的模块的mkmf 版本?

【问题讨论】:

    标签: python ruby setuptools newgem


    【解决方案1】:

    解决它的一种方法是创建三个不同的项目:

    • 库本身,独立于 python 和 ruby​​
    • Python 绑定
    • Ruby 绑定

    这可能是最简洁的解决方案,尽管在发布时需要做更多工作,但它的优点是您可以发布新版本的 Ruby 绑定,而无需发布新的库/python 绑定版本。

    【讨论】:

      【解决方案2】:

      作为 Johan 所说的补充,感谢 swig,我在 Python 中使用了几个 c/c++ 支持库。您用 c/c++ 编写代码,然后为您想要支持的每种语言制作一个中间模板。它对 Python 来说相当轻松,但必须对 Ruby 进行一些考虑......即我认为 pthread 支持不会让 ruby​​ 满意,反之亦然。

      http://www.swig.org/ 它的学习曲线有些陡峭,因此最好找到一个示例项目来演示如何将包装器用于您的目标语言。

      这绝对是一个有用的工具,因为它使您的代码更加简洁,同时仍然提供与多种语言(PHP、Python、Ruby,我相信是 c#)的强大绑定

      【讨论】:

        猜你喜欢
        • 2016-02-24
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 2015-05-14
        • 1970-01-01
        相关资源
        最近更新 更多