结合Python& Ruby扩展模块

时间:2009-02-04 13:42:05

标签: python ruby setuptools newgem

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

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

我一直在尝试使用newgem添加Ruby支持,我可以使用rake gem构建扩展版本。但是,组合源有一个丑陋的目录布局(混合Gem风格和Setuptools风格的结构),构建过程是一个kludge。

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

是否有更健全的方法使代码可用于这两种语言?我应该在一个单独的Gem中复制与Python无关的代码吗?我应该将独立代码作为使用autotools构建的单独lib发布吗?是否有可以跳过不需要的模块的mkmf版本?

2 个答案:

答案 0 :(得分:5)

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

  • 图书馆本身,独立于python&红宝石
  • Python绑定
  • Ruby绑定

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

答案 1 :(得分:0)

对Johan所说的补充,由于swig,我在Python中使用了几个c / c ++支持库。您使用c / c ++编写代码,然后为您要支持的每种语言创建一个中间模板。它对Python来说相当轻松,但必须考虑Ruby的一些注意事项......即我不认为pthread支持是对ruby满意,反之亦然。

http://www.swig.org/ 它的学习曲线有点陡峭,所以最好找一个示例项目来演示如何使用目标语言的包装器。

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