1. 程式人生 > >[JAVA]Runtime 呼叫Python指令碼(可傳參)

[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"};