English 中文(简体)
结合Python和Ruby的扩展模块
原标题:
  • 时间:2009-02-04 13:42:04
  •  标签:

我有一个用于Python的C扩展模块,我想让Ruby程序员也可以使用它。

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

我一直在尝试使用 newgem 添加 Ruby 支持,并且可以使用 rake gem 构建扩展版本。但是,合并的源具有丑陋的目录布局(混合了 Gem 样式和 Setuptools 样式结构),并且构建过程也很混乱。

我不能把所有的资源都放在同一个目录下,因为mkmf会自动捕获Python依赖模块并尝试构建它,用户不应该必须安装Python来编译一个不会使用的模块。我的当前解决方法是让extconf.rb 将Python独立源文件复制到与Ruby相关的扩展模块的同一目录中。

有没有更明智的方法使代码可用于两种语言?我应该只是在一个单独的Gem中复制Python独立的代码吗?我应该将独立的代码发布为使用autotools构建的单独的lib吗?有没有一个版本的可以跳过不需要的模块?

最佳回答

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

  • The library itself, independent on python & ruby
  • Python bindings
  • Ruby bindings

这可能是最清洁的解决方案,尽管在发布时需要进行更多的工作,但它具有优势,即您可以发布 Ruby 绑定的新版本,而无需发送新的库/Python 绑定版本。

问题回答

补充一下Johan所说的,我用了一些c/c++支持库,借助于swig在Python中。你可以用c/c++编写代码,然后为每个你想要支持的语言创建一个中介模板。对于Python来说,这相当轻松,但对于Ruby来说,则需要一些考虑……特别是我认为pthread支持在ruby中并不适用,或者反之。

http://www.swig.org/ It s got a somewhat steep learning curve so it might be best to find an example project out there that demonstrates how to use the wrapper for your target languages.

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





相关问题
热门标签