我想从Ruby调用Python代码.有一些现有工具可以做到这一点,本网站上的一些问题推荐http://rubypython.rubyforge.org/,它通过在Ruby中嵌入Python解释器来工作.我正在开发一个使用Python独有的库的应用程序(即图形工具,我有理由使用它,比如说RGL),但是最终的项目是在Rails中,因此使用Ruby代码进行控制工作将是理想的.我希望它快速,所以我使用PyPy.有没有办法让PyPy解释器嵌入Ruby代码中,或者在rubypython
运行PyPy时使Python解释器?
不,好吧,不是没有很多工作.
首先,RubyPython并不真正包含嵌入式Python解释器; 它只是在运行时包装解释器.如文档中所示,您可以使用任何您想要的Python运行它,例如:
>> RubyPython.start(:python_exe => "python2.6")
Run Code Online (Sandbox Code Playgroud)
那么,当你尝试时会发生什么?
>> 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
Run Code Online (Sandbox Code Playgroud)
不幸的是,它需要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仍然是一项正在进行中的工作,(请参阅http://mail.python.org/pipermail/pypy-dev/2012-March/009661.html了解6个月前的状况.)所以,你首先需要帮助PyPy嵌入准备好黄金时间和稳定,然后移植较低级别的rubypython以使用不同的API.
如果是后者,你就是SOL.PyPy永远不会支持CPython内部,CPython内部的大部分内容实际上是用RPython或Python编写的,然后为PyPy编译,所以原则上它甚至都不可能.您必须彻底重写所有rubypython以找到使其工作的方法,而不是仅仅移植较低级别.
另一种方法是将Ruby移植到RPython并使用PyPy构建一个Ruby解释器和一个可以在更高层次上相互通信的Python解释器.然后,为PyRuby和PyPy写一些类似rubypython的东西将是微不足道的.但是,第一步是愚蠢的.
归档时间: |
|
查看次数: |
1099 次 |
最近记录: |