java 调用python总结 (二)

最近通过java 调用python脚本,总结一下 前文已经大概讲述了几种方式 ,但并不全面,这里在补充一下, 通过java 调用 并带参数 且返回python执行结果;


ProcessBuilder

ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。
每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。 进程也可以由Runtime.exec()启动。


java 调用python几个问题

  • Runtime.exec 数组参数 ,接收不了python的结果返回值(已亲测);
  • 但ProcessBuilder 并不能直接执行python内容,只能执行python文件,明白我的意思吗? 就是你直接将python脚本写在代码里 ProcessBuilder 是不认识的, 但你告诉他文件在哪 他可以执行(当然这只是目前提供出来的API)
  • ProcessBuilder 接受返回值时 前面总会多个b’,后面还有很多空格已经/u0000 这些(有大神的话 求指导下),下面是我的执行结果 约定只返回给我个0;
    运行耗时 :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 ,大家互助成长.

你可能感兴趣的:(python)