常用的方法有:
1、利用runtime在本地运行python脚本; runtime调用python实际上是通过cmd命令本地运行python脚本,对传递参数的长度有限制
2、通过jython调用; 通过jython调用的方式无法导入numpy等第三方库
3、java通过rpc(远程过程调用)调用python;远程rpc掉用不存在上述问题,Java程序作为客户端,pythen程序作为服务端。 但是问题是操作复杂。
原生Runtime在本地调用
1、调用方法 Runtime.getRuntime().exec()。
Runtime.getRuntime() 返回当前应用程序的Runtime对象,该对象的 exec() 方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。
该方法的参数可以是字符串,也可以是字符串数组。第一个参数是指定外部程序,最好是写全路径。第二个是指定脚本文件路径
Runtime.getRuntime().exec(new string["程序路径","脚本路径"]) Runtime.getRuntime().exce("程序路径 脚本路径")
proc.waitFor():指定等待程序运行,并获得运行的返回值,0表示成功,1表示远程调用失败,2表示pythen脚本出错。
//java 调用pythen文件对数据库进行数据分析的操做,并将pythen打印到控制台的数据打印到Java控制台。
public void communityDivision(){
Process proc;
try {
proc = Runtime.getRuntime().exec("D:\\develop\\anaconda3\\python.exe C:\\Users\\DELL\\Desktop\\jiaoben\\jiaoben\\企业关系计算\\Louvain.py");
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"utf-8"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
int i = proc.waitFor();
System.out.println("pythen文件执行结果:"+i);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注意问题:使用Runtime原生调用方法,没办法接受自定义的返回值,只能读取pythen脚本打印到控制台的内容。因为pythen代码在默认是GBK编码,读取内容时间容易出现乱码问题。
解决办法有两种,问题原因就是Java和pythen中编码格式不一样,保持统一就好。
在Java中指定编码格式,直接在创建字符输入流对象的时候指定读取的编码规则。
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"utf-8"));
在pythen中指定打印的编码格式
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')