天天看點

java 調用python腳本過程,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 {

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);

}

}

标簽:process,調用,java,String,python,Process,程序,Runtime

來源: https://www.cnblogs.com/floakss/p/10719906.html