从Ruby调用Python - PyPy兼容性

时间:2012-10-30 18:57:44

标签: python ruby pypy

我想从Ruby调用Python代码。有一些现有的工具可以做到这一点,本网站上的一些问题推荐http://rubypython.rubyforge.org/,这可以通过在Ruby中嵌入Python解释器来实现。我正在开发一个使用Python独有的库的应用程序(即图形工具,我有理由使用它,比如说RGL),但是最终的项目是在Rails中,因此使用Ruby代码进行控制工作将是理想的。我希望它快速,所以我使用PyPy。有没有办法让PyPy解释器嵌入到Ruby代码中,或者使rubypython中的Python解释器运行PyPy?

1 个答案:

答案 0 :(得分:5)

没有。好吧,不是没有很多工作。

首先,RubyPython并不真正包含嵌入式Python解释器;它只是在运行时包装解释器。如the docs所示,您可以使用任何您想要的Python运行它,例如:

>> RubyPython.start(:python_exe => "python2.6")

那么,当你尝试时会发生什么?

>> RubyPython.start(:python_exe => "/usr/local/bin/pypy")
RubyPython::InvalidInterpreter: An invalid interpreter was specified.
    from /Library/Ruby/Gems/1.8/gems/rubypython-0.6.3/lib/rubypython.rb:67:in `start'
    from /Library/Ruby/Gems/1.8/gems/rubypython-0.6.3/lib/rubypython/python.rb:10:in `synchronize'
    from /Library/Ruby/Gems/1.8/gems/rubypython-0.6.3/lib/rubypython/python.rb:10:in `synchronize'
    from /Library/Ruby/Gems/1.8/gems/rubypython-0.6.3/lib/rubypython.rb:54:in `start'
    from (irb):4

不幸的是,它需要CPython 2.4-2.7。它不适用于CPython 3.x,PyPy,Jython等。再次,来自文档:

  

RubyPython已经使用基于C的Python解释器(cpython)进行了测试,版本为2.4到2.7。计划开展工作以支持Python 3,但尚未启动。如果您有兴趣帮助我们启用Python 3支持,请告诉我们。

不看代码,我猜测rubypython使用rubyffi:  *包装CPython嵌入API,或  *通过其dll / so / dylib导出直接调用CPython VM内部。

如果是前者,该项目可能是可行的,但仍然需要做很多工作。 PyPy不支持CPython的嵌入API。如果它有自己的嵌入式API,您可能会重写rubypython的较低级别来包装它们,并保留更高级别的代码。但是完全嵌入PyPy仍然是一项正在进行的工作,(6月前见http://mail.python.org/pipermail/pypy-dev/2012-March/009661.html了解事态。)所以,你需要先帮助PyPy嵌入准备好黄金时段并保持稳定,然后移植较低级别的rubypython以使用不同的API。

如果是后者,你就是SOL。 PyPy永远不会支持CPython内部,CPython内部的大部分内容实际上是用RPython或Python编写的,然后为PyPy编译,所以原则上它甚至都不可能。您必须彻底重写所有rubypython以找到使其工作的方法,而不是仅仅移植较低级别。

另一种方法是将Ruby移植到RPython并使用PyPy构建一个Ruby解释器和一个Python解释器,它可以在更高层次上相互通信;然后,为PyRuby和PyPy写一些类似rubypython的东西将是微不足道的。但第一步是做到了。