java调用python脚本

问题性质:java调用第三方程序,创建子进程并对其管理

解决:使用Runtime类和Process类

思路:

Runtime rt=Runtime.getRuntime(); - Runtime 运行时类;
                     唯一存在(单例),用户不可创建和实例化(就是new Runtime());
                     可用静态方法getRuntime()获取当前Runtime实例,可用于获取JVM相关状态信息或操作JVM;

Process pr=rt.exec(args); - Runtime的exec()创建子进程,返回一个Process实例;
                Process抽象进程类;
                接受 rt.exec(args) 返回的Process实例,并可以管理它

代码:

java工具类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PythonInvoke {
    /**
     * java项目调用python脚本
     * 输入:py文件的绝对路径
     * 输出:
     */
    public static void invokePy(String []para) {
        System.out.println("执行....");
        try {
           Process process=Runtime.getRuntime().exec(para);
       
       //接收子进程的I/O操作(py脚本执行的输入输出)
       //process.getInputStream() 将子进程的i/o流重定向到父进程,由父进程控制子进程的i/o
            BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));   //windows下编码GBK防止java读取乱码        
                                                  
            String line;
            while((line=reader.readLine())!=null) {
                System.out.println(line);
            }
            reader.close();
       process.destory(); //结束子进程
            //process.waitFor(); //使子进程等待,可能会引起阻塞-待分析(输入输出导致缓存满?)
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("结束....");
    }
}

python脚本:
# -*- coding: UTF-8 -*-
import numpy as np

def main():
a = np.ones(3)
print(a)
print('java
调用py脚本')

if __name__ == '__main__':
main()
测试代码:

public
class Test { public static void main(String[] args) { String []para=new String[] {"python","D:\\java_invoked.py"}; PythonInvoke.invokePy(para); } }

 

posted @ 2019-04-16 20:44  丨Kouch  阅读(4096)  评论(0编辑  收藏  举报