3

私はPythonを初めて使用し、JavaからPythonの関数を呼び出そうとしています。

私の主な要件は次のとおりです。

  • .pyjava から呼び出せるようにするためだけにファイルを変更する必要がないという意味で、呼び出しは透過的である必要があります。その中にいくつかの関数を含む任意の python ファイルが与えられる場合があります。.pyファイルを変更することなく、これらの関数を呼び出すことができるはずです。
  • intプリミティブ型 ( 、など) または非プリミティブ型 ( 、) の両方の引数を Java から Python 関数に送信し、Python から返されたオブジェクト (プリミティブ型または非プリミティブ型の可能性がある) を受信できるようにしStringたいジャバに。pandas DataFrame と numpy ndarray も使用しているため、対応するオブジェクトを Java との間で送受信できるようにしたいと考えています。floatsHashMapArrayList
  • Jython では利用できない可能性のある新しいライブラリを使用する必要がある可能性があるため、できればJython ではなく CPython に固執したいと考えています。

オンラインで見つけたいくつかのオプションがあります。いくつかは次のとおりです。

  • .pyスクリプト ファイルを変更せずに Python 関数を呼び出すことができるJython のPythonInterpreterを使用します。

    py1.py

     def square2(list):
         squares = []
         for i in list:
             squares.append(i*i)
         return squares
    

    JythonTest.groovy

     import org.python.util.PythonInterpreter
     import org.python.core.*;
    
     class JythonTest
     {
          static main(def args)
          {
              PythonInterpreter pi = new PythonInterpreter()
              pi.exec("from py1 import square2")
              PyFunction pf = (PyFunction)pi.get("square2")
              println pf.__call__(new PyList([1,2,3,4]))[2]   //9
          }
     }
    

    私は自分のニーズを十分に満たすことができます。しかし、CPython ではありません。

  • Use ScriptEngine : これは PythonInterpreter と非常によく似ています。しかし、再びそのJythonです。また、PythonInterpreter とは異なり、Jython 2.5+ では動作せず、PyObjects に直接アクセスできません。したがって、このオプションは非常にうまく閉じることができます。

  • py4jを使用します: Jython PythonInterpreter の場合と同じくらい最小限の例を見つけることができません
  • java2pythonを使用します。しかし、上記の要件を満たすことができるかどうかを判断できるように、java から python を呼び出すことについてはあまり情報が提供されていません。誰かがこれについてもっと光を当てることができますか? より具体的には、Jython PythonInterpreter のコードと同じくらい最小限のコードを書くことができれば.
  • JPypeを使用します。また、私はプロジェクトが開発中ではないことを感じました。それは...ですか?

上記のすべてのアプローチを正しく理解していれば、Jython PythonInterpreter が最良の選択のようです。それらをつかみながら、私は間違いを犯しましたか?また、他に良い選択肢はありますか?

4

2 に答える 2