Ruby から Python コードを呼び出そうとしています。これを行うための既存のツールがいくつかあり、このサイトにはhttp://rubypython.rubyforge.org/を推奨するいくつかの質問があります。これは Python インタープリターを Ruby に埋め込むことによって機能します。私はPythonに固有のライブラリ(つまり、RGLなどを使用する理由があるグラフツール)を使用するアプリに取り組んでいますが、最終的なプロジェクトはRailsであるため、Rubyコードで制御作業を行うのが理想的です。速くしたいのでPyPyを使っています。PyPy インタープリターを Ruby コードに埋め込む方法、または Python インタープリターをrubypython
PyPy で実行する方法はありますか?
1 に答える
いいえ、まあ、多くの作業がないわけではありません。
まず、RubyPython には Python インタープリターが組み込まれていません。実行時にインタープリターをラップするだけです。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 は、バージョン 2.4 から 2.7 までの C ベースの Python インタープリター (cpython) でテストされています。Python 3 のサポートを有効にする作業が計画されていますが、まだ開始されていません。Python 3 サポートの有効化にご協力いただける場合は、お知らせください。
コードを見ずに、私は rubypython が rubyffi を使用して次のいずれかを行っていると推測しています。
前者の場合、プロジェクトは実行可能かもしれませんが、それでも多くの作業が必要です。PyPy は CPython の埋め込み API をサポートしていません。独自の組み込み API がある場合、rubypython の下位レベルを書き直して代わりにそれらをラップし、上位レベルのコードをそのままにしておくことができます。しかし、PyPy の埋め込みはまだ進行中です ( 6 か月前の状況については、http://mail.python.org/pipermail/pypy-dev/2012-March/009661.htmlを参照してください)。最初に、PyPy 埋め込みをプライム タイムで安定させる準備を整えてから、下位レベルの rubypython を移植して、さまざまな API を使用する必要があります。
後者ならほぼSOLです。PyPy は CPython の内部構造をサポートすることはありません。CPython の内部構造の多くは、実際には RPython または Python で記述され、PyPy 用にコンパイルされているため、原理的には不可能です。下位レベルを移植するのではなく、rubypython を機能させる方法を見つけるために、すべての rubypython を大幅に書き直す必要があります。
1 つの代替手段は、Ruby を RPython に移植し、PyPy を使用して Ruby インタープリターと Python インタープリターを構築し、より高いレベルで相互に通信できるようにすることです。その場合、PyRuby と PyPy の rubypython のようなものを書くのは簡単です。しかし、その最初のステップは大変なことです。