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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM