標籤:編譯器 抽象 proc 擷取參數 class dos 大小 非同步執行 url
Java 調用python說明文檔
通過java調用python指令碼主要如下三種方式:
1、直接執行python指令碼;
2、執行python.py檔案;
3、使用Runtime.getRuntime()執行指令檔;
前兩種是引入Jython調用pythoninterpreter的類內嵌的編譯器,但是如果調用python的某些擴充庫,會出錯,機器學習的庫用此種方式調用,暫未找到解決辦法(請教大家),----------也許是因為numpy的緣故吧。
第三種方式也是很簡單的一種調用方式。採用java調用控制台進程,即Runtime.getRuntime().exec(),來運行這個python指令碼。下面簡單介紹此種方式用到的知識。
一、有關process
process類是一個抽象類別(所有的方法均是抽象的),封裝了一個進程(即一個執行程式)。
process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷毀(殺掉)進程的方法。
processBuilder.start() 和 Runtime.exec 方法建立一個本機進程,並返回 process 子類的一個執行個體,該執行個體可用來控制進程並擷取相關資訊。
建立進程的方法可能無法針對某些本機平台上的特定進程很好地工作,比如,本機視窗進程,守護進程,Microsoft Windows 上的 Win16/DOS 進程,或者 shell 指令碼。建立的子進程沒有自己的終端或控制台。它的所有標準 io(即 stdin,stdout,stderr)操作都將通過三個流 (getOutputStream(),getInputStream(),getErrorStream()) 重新導向到父進程。父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平台僅針對標準輸入和輸出資料流提供有限的緩衝區大小,如果讀寫子進程的輸出資料流或輸入資料流迅速出現失敗,則可能導致子進程阻塞,甚至產生死結。當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續非同步執行子進程。
二、如何建立Process對象,一般有一下兩種方法
1)每個 ProcessBuilder 執行個體管理一個進程屬性集。start() 方法利用這些屬性建立一個新的 Process 執行個體。start() 方法可以從同一執行個體重複調用,以利用相同的或相關的屬性建立新的子進程。
2)Runtime.exec() 方法建立一個本機進程,並返回 Process 子類的一個執行個體。
三、代碼示範
Java核心代碼:
1 Process proc=Runtime.getRuntime().exec(args1); //執行py檔案2 3 4 InputStreamReader stdin=new InputStreamReader(proc.getInputStream());5 6 //構造一個預設編碼集的InputStreamReader類7 8 LineNumberReader input=new LineNumberReader(stdin);//用來按行讀取文字檔
其中args1是String[] { "python",path,url1,url2}; ,path是python檔案所在路徑,url1是參數1,url2是參數2。
Python代碼:
其中sys.argv用於擷取參數url1,url2等。
sys.argv[0]:是python指令碼名
sys.arg[1]及以後各項:是接收的參數
Java 調用python說明文檔