簡體   English   中英

從Ruby調用Python - PyPy兼容性

[英]Calling Python from Ruby - PyPy compatibility

我想從Ruby調用Python代碼。 有一些現有工具可以做到這一點,本網站上的一些問題推薦http://rubypython.rubyforge.org/ ,它通過在Ruby中嵌入Python解釋器來工作。 我正在開發一個使用Python獨有的庫的應用程序(即圖形工具,我有理由使用它,比如說RGL),但是最終的項目是在Rails中,因此使用Ruby代碼進行控制工作將是理想的。 我希望它快速,所以我使用PyPy。 有沒有辦法讓PyPy解釋器嵌入Ruby代碼中,或者讓rubypython的Python解釋rubypython運行PyPy?

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

首先,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支持,請告訴我們。

在不查看代碼的情況下,我猜測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的東西將是微不足道的。 但是,第一步是愚蠢的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM