不行,除非付出大量的工作。
首先,RubyPython并没有真正包含一个嵌入式的Python解释器;它只是在运行时包装了解释器。如
文档所示,你可以使用任何你想要的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的较低级别以包装那些API,而保留高级别代码不变。但是,嵌入PyPy仍然是一个正在进行中的工作(请参见
http://mail.python.org/pipermail/pypy-dev/2012-March/009661.html,了解6个月前的情况)。因此,您需要首先帮助使PyPy嵌入准备好投入使用并稳定,然后将rubypython的较低级别移植到使用不同API。
如果是后者,你基本上没有机会了。PyPy永远不会支持CPython内部结构,而CPython的许多内部实际上是用RPython或Python编写的,然后为PyPy编译,因此原则上甚至不可能。您必须彻底重写所有rubypython的内容,找到一种使其工作的方法,而不仅仅是移植较低级别。
一个替代方案是将Ruby移植到RPython,并使用PyPy构建一个可以在更高层次上相互通信的Ruby解释器和Python解释器; 然后,编写类似于PyRuby和PyPy的rubypython之类的东西将变得微不足道。但是,第一步非常困难。