CPython 実装で実行される Python プログラムがあり、その中で Java プログラムで定義された関数を呼び出す必要があります。これどうやってするの?
一部の Java オブジェクトも使用できると便利です。
Jython はオプションではありません。CPython で Python 部分を実行する必要があります。
CPython 実装で実行される Python プログラムがあり、その中で Java プログラムで定義された関数を呼び出す必要があります。これどうやってするの?
一部の Java オブジェクトも使用できると便利です。
Jython はオプションではありません。CPython で Python 部分を実行する必要があります。
スレッドを復活させて申し訳ありませんが、もっと良い答えがあると思います:-)
また、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 の作成者です
一番簡単なのは
Java「関数」用の簡単な CLI を作成します。(そんなことはないので、実際には Java クラスのメソッド関数を意味していると仮定します。)
public class ExposeAMethod {
public static void main( String args[] ) {
TheClassToExpose x = new TheClassToExpose();
x.theFunction();
}
}
これをエントリ ポイントとして、実行可能な JAR ファイルをコンパイルおよびビルドします。あれを呼べ
ExposeAMethod.jar
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 プログラムが作成されました。
行きたくない場合は、独自の 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()
しばらく更新されておらず、ドキュメントもあまりありませんが、かなりうまく機能します。
Python についてはわかりませんが、前回は C アプリケーション (NT サービス) から Java を呼び出さなければならなかったので、ロードする必要がありましたjvm.dll
。JNI のドキュメントを参照してください。
また、あなたは常に電話をかけます
os.system("java com.myapp.MyClass")
パフォーマンスを気にしない場合。
http://www.javaworld.com/javaworld/jw-05-2001/jw-0511-legacy.htmlのようなものに基づいて、Java を埋め込む python C 拡張機能を作成する必要があります。別のサブプロセスで Java を起動します。