2012-10-30 41 views
3

我正在从Ruby调用Python代码。有几个现有的工具可以做到这一点,并且在这个网站上有几个建议http://rubypython.rubyforge.org/的问题,它通过在Python中嵌入Python解释器来工作。我正在研究一个使用Python特有的库的应用程序(即图形工具,我有使用RGL的理由),但最终的项目在Rails中,因此使用Ruby代码执行控制工作将是理想的。我希望它快速,所以我使用PyPy。有没有办法让PyPy解释器嵌入到Ruby代码中,或者让Python解释器在rubypython中运行PyPy?从Ruby调用Python - PyPy兼容性

+1

您是否考虑过使用构建于JVM上并使用JRuby的Python虚拟机?如果你采用这种方法,在他们之间分享数据将是微不足道的。 –

+0

“why_'就像邪恶的东西 –

+0

@ZephyrPellerin:这并不能真正帮助OP的问题。如果他只想使用任何Python,他已经从rubypython和标准的CPython解释器中获得了。他想要运行PyPy。能够运行Jython并没有让他更接近这一点。 – abarnert

回答

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 /调用CPython的VM内部使/ dylib出口。

如果是前者,该项目可能是可行的,但仍然很多工作。 PyPy不支持CPython的嵌入式API。如果它拥有自己的嵌入式API,则可以重写rubypython的较低级别来包装这些API,并保留较高级别的代码。但是嵌入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的代码将是微不足道的。但是,这第一步是一个愚蠢的。