8

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

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

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

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

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

4

2 回答 2

5

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

  • 库本身,独立于 python & ruby
  • Python 绑定
  • 红宝石绑定

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

于 2009-02-04T15:35:56.697 回答
0

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

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

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

于 2009-02-05T03:54:55.190 回答