Python から Java を呼び出す

Marion Paul Kenneth Mendoza 2023年10月10日
  1. Pyjnius を使用して Python から Java を呼び出す
  2. Javabridge を使用して Python から Java を呼び出す
  3. JPype を使用して Python から Java を呼び出す
  4. Py4J を使用して Python から Java を呼び出す
Python から Java を呼び出す

前回の記事では、Jython を使用して Python から Java を呼び出す方法に取り組みました。詳細については、この リンク を参照してください。

ただし、Python から Java を呼び出す方法は複数あります。 したがって、この記事では、Python から Java を呼び出すいくつかの方法について説明します。

Pyjnius を使用して Python から Java を呼び出す

Pyjniusはリフレクションを使用して Java クラスを Python ランタイムにプロビジョニングし、Java ネイティブ インターフェイスに基づいています。

前提条件:

  1. Java をインストールします。できれば OpenJDK 11 をインストールしてください。

  2. javac をインストールする

    apt-get install openjdk-11-jdk-headless
    
  3. 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 Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn