概要
- 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コードの内容は割愛する
処理順は大まかに
- Pythonスクリプトを呼び出す
- Python標準出力をJavaの標準出力に出るよう設定
- Pythonスクリプトの実行
- (おまけ)終了コードの判定
前提
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);
}
コメント