最近通过java 调用python脚本,总结一下 前文已经大概讲述了几种方式 ,但并不全面,这里在补充一下, 通过java 调用 并带参数 且返回python执行结果;
ProcessBuilder
ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。
每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。 进程也可以由Runtime.exec()启动。
java 调用python几个问题
运行耗时 :0 s
waitFor : 0
服务状态 :b'0\n'
Java代码
//参数我是按数组传的,前面两个参数不算 从 status 开始;
ProcessBuilder str = new ProcessBuilder("python","D:\\script\\hay\\Tok.py" , "status",
"192.168.6.49", "8001-hap-sy-app-server", "status");
Process start = str.start();
String result = "";
InputStream in = start.getInputStream();
byte[] re = new byte[1024];
while (in.read(re) != -1) {
result = result + new String(re);
}
//正常结束为0
int waitFor = start.waitFor();
long s = new Date().getTime() - date ;
System.out.println("运行耗时 :"+s / 1000+" s");
System.out.println("waitFor : " +waitFor);
System.out.println("服务状态 :"+result);
String replace = result.replace("b'", "");
System.out.println(replace);
python
import socket,json,sys
class_name=sys.argv[1]
ip_addr=sys.argv[2]
service_name=sys.argv[3]
action=sys.argv[4]
addr=(ip_addr,8888)
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
send_str={'name':service_name,'action':action,'class_name':class_name}
client.connect(addr)
client.send(json.dumps(send_str).encode('utf-8'))
exec_status=client.recv(512)
print(exec_status), # 这边输出 外面才能接到;
client.close()
有问题欢迎留言 或者Q我 2514506878 ,大家互助成长.