Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Ruby-PyPy兼容性调用Python_Python_Ruby_Pypy - Fatal编程技术网

从Ruby-PyPy兼容性调用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?没有。当然,不是没有很多工作

我想从Ruby调用Python代码。这个站点上有一些现有的工具可以实现这一点,还有一些问题,可以通过在Ruby中嵌入Python解释器来实现。我正在开发一个应用程序,它使用Python特有的库(即graph tool,我有理由使用它,比如说RGL),但最终的项目是Rails,所以让Ruby代码来完成控制工作将是理想的。我希望它是快速的,所以我使用PyPy。有没有办法让PyPy解释器嵌入到Ruby代码中,或者让Python解释器在
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库?