2012-10-30 53 views
3

我正在從Ruby調用Python代碼。有幾個現有的工具可以做到這一點,並且在這個網站上有幾個建議http://rubypython.rubyforge.org/的問題,它通過在Python中嵌入Python解釋器來工作。我正在研究一個使用Python特有的庫的應用程序(即圖形工具,我有使用RGL的理由),但最終的項目在Rails中,因此使用Ruby代碼執行控制工作將是理想的。我希望它快速,所以我使用PyPy。有沒有辦法讓PyPy解釋器嵌入到Ruby代碼中,或者讓Python解釋器在rubypython中運行PyPy?從Ruby調用Python - PyPy兼容性

+1

您是否考慮過使用構建於JVM上並使用JRuby的Python虛擬機?如果你採用這種方法,在他們之間分享數據將是微不足道的。 –

+0

「why_'就像邪惡的東西 –

+0

@ZephyrPellerin:這並不能真正幫助OP的問題。如果他只想使用任何Python,他已經從rubypython和標準的CPython解釋器中獲得了。他想要運行PyPy。能夠運行Jython並沒有讓他更接近這一點。 – abarnert

回答

5

不,不是沒有很多工作。

首先,RubyPython並沒有真正包含嵌入式Python解釋器;它只是在運行時包裝解釋器。正如the docs所示,你可以用任何你想要的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 /調用CPython的VM內部使/ dylib出口。

如果是前者,該項目可能是可行的,但仍然很多工作。 PyPy不支持CPython的嵌入式API。如果它擁有自己的嵌入式API,則可以重寫rubypython的較低級別來包裝這些API,並保留較高級別的代碼。但是嵌入PyPy仍然在進行中(關於6個月前的狀態,請參閱http://mail.python.org/pipermail/pypy-dev/2012-March/009661.html)。因此,您需要首先幫助PyPy嵌入到黃金時間並保持穩定,然後移植到較低級別rubypython使用不同的API。

如果是後者,你幾乎是SOL。 PyPy永遠不會支持CPython內部,而CPython內部的許多內容實際上是用RPython或Python編寫的,然後編譯爲PyPy,所以原則上甚至不可能。你必須徹底重寫所有的rubypython才能找到使其工作的方法,而不是僅僅移植到較低的級別。

一種替代方法是將Ruby移植到RPython並使用PyPy構建一個Ruby解釋器和一個Python解釋器,它們可以在更高層次上相互交流;那麼,爲PyRuby和PyPy編寫類似rubypython的代碼將是微不足道的。但是,這第一步是一個愚蠢的。