丰富的第三方库使得python非常适合用于进行数据分析,最近在项目中就涉及到java调用python实现的算法。目前,java调用python主要包括三种方法:1、利用runtime在本地运行python脚本;2、通过jython调用;3、java通过rpc(远程过程调用)调用python。其中,runtime调用python实际上是通过cmd命令本地运行python脚本,对传递参数的长度有限制;而通过jython调用的方式无法导入numpy等第三方库。通过rpc远程调用的方式则不存在上述限制,是比较理想的方式。
1、通过runtime调用python
代码如下:
package pythonTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class pythonTest {
public static void main(String[] args) {
String filePath = ".\\src\\AverageEcho6211701.txt";
String coePath = ".\\src\\OVlidar20190116.txt";
String[] data = TxtUtil.getContentByLine(filePath,3000);
String[] coeData = TxtUtil.getContentByLine(coePath, 500);
System.out.println(data[0]);
int bearing = 90;
double decCoe = 0.25;
try {
String[] pythonArgs = new String[] { "python", ".\\src\\11.py", String.valueOf(bearing), String.valueOf(decCoe),
String.join(",", data)};
String[] appendPythonArgs = new String[pythonArgs.length + coeData.length];
System.arraycopy(pythonArgs, 0, appendPythonArgs, 0, pythonArgs.length);
System.arraycopy(coeData, 0, appendPythonArgs, pythonArgs.length, coeData.length);
Process proc = Runtime.getRuntime().exec(pythonArgs);// 执行py文件
// 定义Python脚本的返回值
String result = null;
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
result = line;
}
in.close();
proc.waitFor();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
通过runtime调用实际上是通过cmd命令在本地运行python脚本,参数以字符串形式进行传递,当字符串超出一定长度时程序会报错。
java.io.IOException: Cannot run program "python