1. ホーム
  2. java

[解決済み] py4Jを使った最も簡単な例

2022-02-05 09:08:52

質問

インストールしたのは py4J の上でpipを使って conda の仮想環境をPythonで構築しました。 超簡単な例を書いてみました AdditionApplication.java をテストするために py4J が、コンパイルに失敗する、つまり

javac AdditionApplication.java

は、次のような文句を言って失敗します。 GatewayServer が定義されていない。

私はPythonの知識はありますが、残念ながらJavaの知識はありません。他に用意するものはありますか?

public class AdditionApplication {

  public int addition(int first, int second) {
    return first + second;
  }

  public static void main(String[] args) {
    AdditionApplication app = new AdditionApplication();
    // app is now the gateway.entry_point
    GatewayServer server = new GatewayServer(app);
    server.start();
  }
}

因みに、私は以下のバージョンのJavaをインストールしています。

java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

アップデート1

追加した後 import py4j.GatewayServer; を先頭に追加すると、違うエラーが発生しました。

package py4j does not exist

アップデート2

pip install py4j を残しています。 jar の下にあるファイル <PATH_TO_CONDA_ENVIRONMENT>/share/py4j/py4j0.8.1.jar . でクラスパスに追加しています。

javac -cp <PATH_TO_CONDA_ENVIRONMENT>/share/py4j/py4j0.8.1.jar AdditionApplication.java

と出力されます。

AdditionApplication.class

実行方法は?

最終アップデートと解決策

これまでの修正を適用して、やっとこさ、でコードを実行。

java -cp <PATH_TO_CONDA_ENVIRONMENT>/share/py4j/py4j0.8.1.jar AdditionApplication 

は、バックグラウンドで実行されるコードです。テストするには

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                   # connect to the JVM
>>> random = gateway.jvm.java.util.Random()   # create a java.util.Random instance
>>> number1 = random.nextInt(10)              # call the Random.nextInt method
>>> number2 = random.nextInt(10)
>>> print(number1,number2)
(2, 7)
>>> addition_app = gateway.entry_point        # get the AdditionApplication instance
>>> addition_app.addition(number1,number2)    # call the addition method

解決方法は?

輸入 GatewayServer から py4j パッケージを使用することで、未修飾のクラスをアプリケーションで使用することができます。

import py4j.GatewayServer;