Python から Java を呼び出す
-
Pyjnius
を使用して Python から Java を呼び出す -
Javabridge
を使用して Python から Java を呼び出す -
JPype
を使用して Python から Java を呼び出す -
Py4J
を使用して Python から Java を呼び出す
前回の記事では、Jython
を使用して Python から Java を呼び出す方法に取り組みました。詳細については、この リンク を参照してください。
ただし、Python から Java を呼び出す方法は複数あります。 したがって、この記事では、Python から Java を呼び出すいくつかの方法について説明します。
Pyjnius
を使用して Python から Java を呼び出す
Pyjnius
はリフレクションを使用して Java クラスを Python ランタイムにプロビジョニングし、Java ネイティブ インターフェイスに基づいています。
前提条件:
-
Java をインストールします。できれば OpenJDK 11 をインストールしてください。
-
javac
をインストールするapt-get install openjdk-11-jdk-headless
-
pyjnius
モジュールをインストールするpip install pyjnius==1.4.1
以下のコード スニペットの例では、Java クラス System
への参照を作成し、Java in Python Success
という入力で out.println static
メソッドを呼び出します。
from jnius import autoclass
autoclass("java.lang.System").out.println("Java in Python Success")
次のコマンドを使用してこれを実行しましょう。
python main.py
出力:
Java in Python Success
Javabridge
を使用して Python から Java を呼び出す
Javabridge
ライブラリーは、Python コードの実行に使用できる Java クラス org.cellprofiler.javabridge.CPython
をロードします。
Python インタープリターから呼び出された Java コード内または Java 内でクラスを使用して、Java に埋め込まれた Python を実行できます。
次のコマンドで Javabridge
をインストールします。
pip install javabridge
複数のスクリプトを実行している間は、Python オブジェクトへの参照を維持することが望ましい場合があります。 たとえば、次のルーチンを使用すると、Java の呼び出し元はトークンを使用して Python の値 (基本型またはオブジェクト) を参照できます。このトークンは、いつでも実際の値に交換できます。
Java コードは、参照の有効期間を管理します。
import os
import javabridge
javaclasspath = (
[
os.path.realpath(
os.path.join(os.path.dirname(__file__), "..", "build", "classes")
)
]
+ [os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "cfg"))]
+ [
os.path.realpath(
os.path.join(os.path.dirname(__file__), "..", "lib", name + ".jar")
)
for name in ["hamcrest-core-1.1", "logback-core-0.9.28", "slf4j-api-1.6.1"]
]
+ javabridge.JARS
)
javabridge.start_vm(class_path=[os.pathsep.join(javaclasspath)], run_headless=True)
try:
print
javabridge.run_script(
'java.lang.String.format("Hello, %s!", greetee);', dict(greetee="world")
)
finally:
javabridge.kill_vm()
JPype
を使用して Python から Java を呼び出す
JPype
は、Python から完全な Java アクセスを提供する Python モジュールです。 この共有メモリベースのソリューションは、優れた計算速度を実現しながら、CPython
および Java ライブラリ全体へのアクセスを提供します。
この方法では、Python での Java スレッド化と Java インターフェイス実装の使用、および 2 台のマシン間の直接メモリ アクセスも有効になります。
次のコマンドで JType
をインストールします。
pip install jpype1
インストールが完了したら、jpype
モジュールのインポートを開始できます。
import jpype as jp
jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM()
Py4J
を使用して Python から Java を呼び出す
Py4J
を使用すると、Java 仮想マシン内の Java オブジェクトに、Python インタープリターで実行されている Python アプリケーションから動的にアクセスできます。
このメソッドは、Java オブジェクトが Python インタープリターに存在するかのように呼び出され、標準の Python コレクション メソッドを介して Java コレクションにアクセスできます。 Py4J
は、Java プログラムが Python オブジェクトを呼び戻すことも可能にします。
Py4J
をインストールするには、次のスニペットを実行します。
pip install py4j
#or
easy_install py4j
Py4J
でできることの短いスニペットを次に示します。
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!")
Jython
とは異なり、Py4J
の一部は Python 仮想マシン (VM) で実行され、最新バージョンの Python で常に更新され、Jython
が適切にサポートしていないライブラリ (例: lxml) を使用できます。
)。 したがって、他の部分が実行されている Java VM を呼び出す必要があります。
Python は JNI の代わりにソケットを介して通信し、Py4J
には独自のプロトコルがあります (特定のケースを最適化したり、メモリを管理したりするためなど)。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn