[JAVA]Runtime 呼叫Python指令碼(可傳參)
使用場景:在java中通過runtime呼叫python指令碼
1.python指令碼中連線Oracle資料庫查詢資料後輸出檔案,指令碼頭內容如下
#!/usr/bin/python3 #encoding=utf-8 import os from pypinyin import pinyin,lazy_pinyin import cx_Oracle as oracle import sys import pypinyin import datetime import redis import argparse os.environ["ORACLE_HOME"] = '/Users/apple/Library/Oracle/instantclient_12_2' os.environ["DYLD_LIBRARY_PATH"] = '/Users/apple/Library/Oracle/instantclient_12_2' os.environ["LD_LIBRARY_PATH"] = '/Users/apple/Library/Oracle/instantclient_12_2' os.environ["NLS_LANG"] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #定義指令碼說明文案 parser = argparse.ArgumentParser(description='-updateuser:操作使用者名稱') #定義指令碼入參 parser.add_argument('-uu', type=str,default=None)
指令碼下面的內容都是查詢資料庫,然後將查詢結果輸出為檔案,就略過了。再補充一下main方法的內容
if __name__ == '__main__': args = parser.parse_args() print(args.uu) cc = ChineseConvertPinYin() cc.execute(args.uu)
2.Java中通過Runtime呼叫執行python
//設定java執行程序的環境變數(臨時的)
String[] envp = new String[]{"LD_LIBRARY_PATH=/Users/apple/Library/Oracle/instantclient_12_2","LANG=UTF-8"};
//exec方法 第一個引數是執行的命令,第二個引數為環境變數資料(環境變數設定方式:NAME=VALUE)
Process pr=Runtime.getRuntime().exec("python3 /Work/pythonWork/pinyin/ChineseConvertPinYin.py -uu wzj",envp);
System.out.println(pr.waitFor());//返回0表示執行成功,返回1表示執行失敗(PS:網上看到有數如果執行多條命令的時候,這個waitFor必不可少,本次沒有實際用途,暫未深入研究)
//獲取輸出流,即:python指令碼中的print 或 shell 的echo
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = null;
while((line = in.readLine()) != null){
System.out.println(line);//輸出每一行列印或echo
}
//獲取異常輸出流
BufferedReader ine = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String linee = null;
while((linee = ine.readLine()) != null){
System.out.println(linee);
}
3.總結
過程中遇到過兩個問題:
1.Python呼叫Oracle連線驅動的問題,使用pip安裝cx_Oracle後,總是報錯,大致內容如下:
cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "dlopen(libclntsh.dylib, 1): image not found". See https://oracle.github.io/odpi/doc/installation.html#macos for help
2.Java Runtime執行的時候,Python指令碼中的臨時環境變數未生效(此處有待後續研究),遂在java程序中設定獨立環境變數,程式碼如下:
String[] envp = new String[]{"LD_LIBRARY_PATH=/Users/apple/Library/Oracle/instantclient_12_2","LANG=UTF-8"};