从Ruby-PyPy兼容性调用Python
我想从Ruby调用Python代码。这个站点上有一些现有的工具可以实现这一点,还有一些问题,可以通过在Ruby中嵌入Python解释器来实现。我正在开发一个应用程序,它使用Python特有的库(即graph tool,我有理由使用它,比如说RGL),但最终的项目是Rails,所以让Ruby代码来完成控制工作将是理想的。我希望它是快速的,所以我使用PyPy。有没有办法让PyPy解释器嵌入到Ruby代码中,或者让Python解释器在从Ruby-PyPy兼容性调用Python,python,ruby,pypy,Python,Ruby,Pypy,我想从Ruby调用Python代码。这个站点上有一些现有的工具可以实现这一点,还有一些问题,可以通过在Ruby中嵌入Python解释器来实现。我正在开发一个应用程序,它使用Python特有的库(即graph tool,我有理由使用它,比如说RGL),但最终的项目是Rails,所以让Ruby代码来完成控制工作将是理想的。我希望它是快速的,所以我使用PyPy。有没有办法让PyPy解释器嵌入到Ruby代码中,或者让Python解释器在rubypython中运行pypypy?没有。当然,不是没有很多工作
rubypython
中运行pypypy?没有。当然,不是没有很多工作
首先,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
不幸的是,它需要cpython2.4-2.7。它不适用于CPython 3.x、PyPy、Jython等。同样,从文档中可以看出:
RubyPython已经用基于C的Python解释器(cpython)进行了测试,版本为2.4到2.7。计划启用Python3支持,但尚未开始。如果您有兴趣帮助我们启用Python 3支持,请告诉我们
不看代码,我猜rubypython正在使用rubyffi来:
*包装CPython嵌入API,或
*通过其dll/so/dylib导出直接调用CPython VM内部
如果是前者,这个项目可能是可行的,但仍然有很多工作要做。PyPy不支持CPython的嵌入api。如果它有自己的嵌入式API,那么您可能会重写rubypython的较低级别来包装这些API,而不用编写较高级别的代码。但是嵌入PyPy仍然是一项正在进行的工作(请参阅6个月前的情况)。因此,您需要首先帮助PyPy嵌入准备好黄金时间和稳定,然后移植rubypython的较低级别以使用不同的API
如果是后者,那么你就是索尔。PyPy永远不支持CPython内部,而CPython内部的许多内容实际上是用RPython或Python编写的,然后为pypypy编译的,因此原则上甚至不可能。您必须彻底重写所有rubypython,以找到使其工作的方法,而不仅仅是移植较低级别
一种选择是将Ruby移植到RPython,并使用PyPy构建一个Ruby解释器和一个Python解释器,它们可以在更高的级别上相互对话;然后,为PyRuby和PyPy编写类似rubypython的东西将是微不足道的。但这第一步很糟糕。您是否考虑过使用构建在JVM上的Python虚拟机和JRuby?如果你采用这种方法,那么在他们之间共享数据将是微不足道的。类似于《邪恶的代码》why_u@ZephyrPellerin:这对OP的问题没有真正的帮助。如果他只是想使用任何Python,他已经从rubypython和一个标准的CPython解释器那里得到了。他想换成派比。能够运行Jython并不能让他更接近这一点。说“我希望速度更快,所以我使用PyPy”有点误导。PyPy的速度是Python的0.1到20倍。如果您实际分析了一些瓶颈代码,并且PyPy为该瓶颈提供了可测量的性能增益,那么这是一个合理的问题。在这一点上,你必须决定重写东西以更间接地在PyPy和ruby之间进行通信(例如,通过popen,或通过套接字)还是找到一种不同的方法来优化瓶颈(例如,使用Cython)。我们可以挑战一下你的givens吗?为什么不使用Django而不是Rails?或者,如果您使用JRuby平台,为什么不使用Rails和其他图形库,例如,或者许多可用的java库?