微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Ruby调用Python – PyPy兼容性

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

解决方法:

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

首先,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 has been tested with the C-based Python interpreter (cpython), versions 2.4 through 2.7. Work is planned to enable Python 3 support, but has not yet been started. If you’re interested in helping us enable Python 3 support, please let us kNow.

没有看代码,我猜测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的东西将是微不足道的.但是,第一步是愚蠢的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐