【Java】JavaからPythonコードを呼び出す

IT

概要

  • JavaからPythonコードを実行する方法を調べたのでmemo
  • 今回はJythonは使用しません
  • Javaコード内からPythonスクリプトを呼び出す方法で実現します
  • 外部ライブラリの利用も可能

はじめに

もしかしたら、「Jythonを使うんじゃないの?」と思った方もいるかもしれません。

僕が調べた限りではJythonがPython2系で開発が止まっており、Python3系は使用できないと分かったため、今回はJythonを使用しません。

サンプルコード

下記で記述するPythonコードが、Javaコード内でscript.pyとして呼び出されている

Javaコード

import java.io.IOException;

public class CallPythonScript {

    public static void main(String[] args){

        // script.pyを呼び出す
        ProcessBuilder pb = new ProcessBuilder("python", "./src/main/java/script.py");

        // Pythonコードの標準出力をJavaの標準出力に出す
        pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);

        try {
            // pythonスクリプトを実行する
            Process process = pb.start();
            // 実行完了までJava側のコードを待機させ、終了コードを出す
            int exitCode = process.waitFor();
            // 正常終了したか、終了コードで判定
            if (exitCode == 0) {
                System.out.println("Python script executed successfully.");
            } else {
                System.out.println("Python script failed with exit code: " + exitCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

Pythonコード

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = a + b

print(c)
print("Hello Python!")

実行結果

[5 7 9]
Hello Python!
Python script executed successfully.

解説

※Pythonコードの内容は割愛する

処理順は大まかに

  1. Pythonスクリプトを呼び出す
  2. Python標準出力をJavaの標準出力に出るよう設定
  3. Pythonスクリプトの実行
  4. (おまけ)終了コードの判定

前提

Pythonコードがコマンドプロンプトやターミナルから実行できること

1.Pythonスクリプトを呼び出す

ProcessBuilder("【Python実行コマンド】", "【.pyのパス】")

ProcessBuilder pb = new ProcessBuilder("python", "./src/main/java/script.py");

2.Python標準出力をJavaの標準出力に出るよう設定

ProcessBuilderで出力されるものをJavaの標準出力にリダイレクトする設定

pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);

3.Pythonスクリプトの実行

ProcessBuilderで呼び出したスクリプトを実行(start)する

// pythonスクリプトを実行する
Process process = pb.start();

実行完了までJavaを待機させる

// 実行完了までJava側のコードを待機させ、終了コードを出す
int exitCode = process.waitFor();

4.(おまけ)終了コードの判定

python側の実行がエラーになった時に分かるように、終了コードを取得し、

  • 終了コードが0→successfully
  • 終了コードが0以外→その終了コード
    を出力するようにする
if (exitCode == 0) {
    System.out.println("Python script executed successfully.");
} else {
    System.out.println("Python script failed with exit code: " + exitCode);
}

コメント

タイトルとURLをコピーしました