3

Ruby から Python コードを呼び出そうとしています。これを行うための既存のツールがいくつかあり、このサイトにはhttp://rubypython.rubyforge.org/を推奨するいくつかの質問があります。これは Python インタープリターを Ruby に埋め込むことによって機能します。私はPythonに固有のライブラリ(つまり、RGLなどを使用する理由があるグラフツール)を使用するアプリに取り組んでいますが、最終的なプロジェクトはRailsであるため、Rubyコードで制御作業を行うのが理想的です。速くしたいのでPyPyを使っています。PyPy インタープリターを Ruby コードに埋め込む方法、または Python インタープリターをrubypythonPyPy で実行する方法はありますか?

4

1 に答える 1

5

いいえ、まあ、多くの作業がないわけではありません。

まず、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 サポートの有効化にご協力いただける場合は、お知らせください。

コードを見ずに、私は ruby​​python が ruby​​ffi を使用して次のいずれかを行っていると推測しています。

前者の場合、プロジェクトは実行可能かもしれませんが、それでも多くの作業が必要です。PyPy は CPython の埋め込み API をサポートしていません。独自の組み込み API がある場合、rubypython の下位レベルを書き直して代わりにそれらをラップし、上位レベルのコードをそのままにしておくことができます。しかし、PyPy の埋め込みはまだ進行中です ( 6 か月前の状況については、http://mail.python.org/pipermail/pypy-dev/2012-March/009661.htmlを参照してください)。最初に、PyPy 埋め込みをプライム タイムで安定させる準備を整えてから、下位レベルの ruby​​python を移植して、さまざまな API を使用する必要があります。

後者ならほぼSOLです。PyPy は CPython の内部構造をサポートすることはありません。CPython の内部構造の多くは、実際には RPython または Python で記述され、PyPy 用にコンパイルされているため、原理的には不可能です。下位レベルを移植するのではなく、rubypython を機能させる方法を見つけるために、すべての ruby​​python を大幅に書き直す必要があります。

1 つの代替手段は、Ruby を RPython に移植し、PyPy を使用して Ruby インタープリターと Python インタープリターを構築し、より高いレベルで相互に通信できるようにすることです。その場合、PyRuby と PyPy の ruby​​python のようなものを書くのは簡単です。しかし、その最初のステップは大変なことです。

于 2012-10-30T19:18:08.690 に答える