3

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

4

1 回答 1

5

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

首先,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 支持,请告诉我们。

不看代码,我猜 ruby​​python 正在使用 ruby​​ffi 来: * 包装 CPython 嵌入 API,或者 * 通过其 dll/so/dylib 导出直接调用 CPython VM 内部。

如果是前者,该项目可能是可行的,但仍有很多工作要做。PyPy 不支持 CPython 的嵌入 API。如果它有自己的嵌入式 API,您可能会重写 ruby​​python 的较低级别来包装它们,而无需理会较高级别的代码。但是完全嵌入 PyPy 仍然是一项正在进行的工作,(请参阅http://mail.python.org/pipermail/pypy-dev/2012-March/009661.html了解 6 个月前的情况。)所以,你'首先需要帮助 PyPy 嵌入准备好黄金时间和稳定,然后移植较低级别的 ruby​​python 以使用不同的 API。

如果是后者,那么您几乎就是 SOL。PyPy 永远不会支持 CPython 内部,而且 CPython 内部的大部分内容实际上是用 RPython 或 Python 编写的,然后为 PyPy 编译,所以原则上它甚至是不可能的。您必须彻底重写所有 ruby​​python 才能找到使其工作的方法,而不仅仅是移植较低级别。

一种替代方法是将 Ruby 移植到 RPython 并使用 PyPy 构建一个 Ruby 解释器和一个可以在更高级别上相互对话的 Python 解释器;那么,为 PyRuby 和 PyPy 编写类似 ruby​​python 的东西就很简单了。但是,第一步是笨拙的。

于 2012-10-30T19:18:08.690 回答