11

CPython 実装で実行される Python プログラムがあり、その中で Java プログラムで定義された関数を呼び出す必要があります。これどうやってするの?

一部の Java オブジェクトも使用できると便利です。

Jython はオプションではありません。CPython で Python 部分を実行する必要があります。

4

6 に答える 6

15

スレッドを復活させて申し訳ありませんが、もっと良い答えがあると思います:-)

また、CPython (またはその他の Python インタープリター) で実行されるライブラリと、呼び出したい Java VM で実行されるライブラリの 2 つの部分を持つPy4Jを使用することもできます。

フロントページと多くのドキュメントに例がありますが、基本的には、Python メソッドであるかのように、Python コードから Java メソッドを呼び出すだけです。

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

通信は、JNI ではなくソケットを介して行われます。

免責事項: 私は Py4J の作成者です

于 2010-09-25T10:55:08.823 に答える
9

一番簡単なのは

  1. Java「関数」用の簡単な CLI を作成します。(そんなことはないので、実際には Java クラスのメソッド関数を意味していると仮定します。)

    public class ExposeAMethod {
        public static void main( String args[] ) {
             TheClassToExpose  x = new TheClassToExpose();
            x.theFunction();
        }
    }
    
  2. これをエントリ ポイントとして、実行可能な JAR ファイルをコンパイルおよびビルドします。あれを呼べ ExposeAMethod.jar

  3. subprocess によって作成されたコマンドから呼び出します。

    import subprocess
    p = subprocess.Popen("java -jar ExposeAMethod.jar", shell=True)
    sts = os.waitpid(p.pid, 0)
    

これが最小です。そして、それは本当に多くはありません。私は Java で 6 行、Python で 3 行を数えました。

この Java クラス コンストラクターまたはメソッド関数に引数を渡したい場合は、さらに数行のコードを記述する必要があります。選択肢は 2 つあります。

  • stdin から引数を読み取り、結果を stdout に書き込みます。これは比較的簡単で、非常に優れたパフォーマンスを発揮します。

  • 引数を Java へのコマンドライン オプションとして解析し、結果を stdout に書き込みます。これは少し難しいですが、非常にうまく一般化できます。おまけに、再利用できる便利なコマンド行 Java プログラムが作成されました。

于 2009-01-13T11:28:40.320 に答える
7

行きたくない場合は、独自の JNI/C ルートを作成してください。

もう 1 つのオプションは、jpype を使用することです。これは、Oracle データベースにアクセスするために常に使用するものです。なぜなら、PC に oracle c ドライバーをインストールするのは面倒だからです。次のようなことができます(ドキュメントから):

 from jpype import * 
 startJVM("d:/tools/j2sdk/jre/bin/client/jvm.dll", "-ea") # or path to your jvm
 java.lang.System.out.println("hello world") 
 shutdownJVM()

しばらく更新されておらず、ドキュメントもあまりありませんが、かなりうまく機能します。

于 2009-01-14T20:00:08.073 に答える
1

Python についてはわかりませんが、前回は C アプリケーション (NT サービス) から Java を呼び出さなければならなかったので、ロードする必要がありましたjvm.dll。JNI のドキュメントを参照してください。

また、あなたは常に電話をかけます

os.system("java com.myapp.MyClass") 

パフォーマンスを気にしない場合。

于 2009-01-13T11:11:40.883 に答える
1

http://www.javaworld.com/javaworld/jw-05-2001/jw-0511-legacy.htmlのようなものに基づいて、Java を埋め込む python C 拡張機能を作成する必要があります。別のサブプロセスで Java を起動します。

于 2009-01-13T11:15:46.947 に答える