1. 程式人生 > >java 直接呼叫python指令碼,並傳遞引數

java 直接呼叫python指令碼,並傳遞引數

最近陸續用python寫了很多檔案處理指令碼,雖然功能都比較簡單 ,但還是感覺到python對檔案處理的簡潔高效 ,越發覺得java的語法相當的繁瑣~

接到個需求處理ftp資料介面 。所以想把python指令碼也用上。java程式碼定時掃描ftp資料倉庫 ,呼叫python指令碼入庫。

直接採用java執行系統命令的方式

@Async
	public void readFileByPython(List<String> filePaths) throws FileNotFoundException {
		URL localSrcUrl = AbstractReadFileLine.class.getResource("");
		String localSrcPath = localSrcUrl.getPath();
		localSrcPath = localSrcPath.substring(1, localSrcPath.length());
		String pythonFile = localSrcPath  + "PythonFileHandle.py";

		int size = filePaths.size() + 2;
		String[] args = new String[size];
		args[0] = "python";
		args[1] = pythonFile;
		for(int i =0;i<filePaths.size() ;i++){
			int index = i+2;
			args[index] = filePaths.get(i);
		}
		try {
			
	            System.out.println("start");  
	            Process proc = Runtime.getRuntime().exec(args);
	            InputStream is = proc.getErrorStream();  
	            InputStreamReader isr = new InputStreamReader(is);  
	            BufferedReader br = new BufferedReader(isr);  
	            String line = null;  
	            System.out.println("<ERROR>");  
	            while((line = br.readLine())!=null){  
	                    System.out.println(line);  
	                    System.out.println("</ERROR>");  
	                    int exitValue = proc.waitFor();  
	                    System.out.println("Process exitValue="+exitValue);  
	            } 
	            System.out.println("end");  
	            } catch (Exception e){  
	            e.printStackTrace();  
	            }  
	         
	}

String[] args = new String[size];   

args[0] = "python";  args[1] = pythonFile;    args[0]表示要執行的是python 指令碼 ,args[1] 指令碼檔案的全路徑

該方法呼叫 AbstractReadFileLine.class 檔案路徑下的 PythonFileHandle.py 指令碼 ,並傳入String陣列型別的引數(需要處理的檔案全路徑)

PythonFileHandle指令碼接受java傳入的檔案路徑引數(陣列),解析併入庫

PythonFileHandle.py 程式碼

import pymssql,time,sys
reload(sys)
sys.setdefaultencoding("utf-8")
class MSSQL:
    def __init__(self,host,user,pwd,db):
        self.host = host
        self.user = user
        self.pwd = pwd
        self.db = db

    def __GetConnect(self):
        if not self.db:
            raise(NameError,"")
        self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")
        cur = self.conn.cursor()
        if not cur:
            raise(NameError,"")
        else:
            return cur

    def ExecQuery(self,sql):
        cur = self.__GetConnect()
        cur.execute(sql)
        resList = cur.fetchall()

        #
        self.conn.close()
        return resList

    def ExecNonQuery(self,sql):
        cur = self.__GetConnect()
        cur.execute(sql)
        self.conn.commit()
        self.conn.close()
        
def insertToCloseList(data ,ms):  
    sql = "insert into t_isee_closelist_infos (WORK_ORDER_ID,CRM_Cdsc_Id,APPRAISE_TYPE,CRM_Accept_Date,latn_code,theme_row_id,TASK_EXECUTE_ROW_ID,CRM_Accept_REASON,ASSET_INTEG_ID) values ( '" 
    temp ="' , '"
    sqlStr = temp.join(data)
    sql = sql + sqlStr + "')"
    ms.ExecNonQuery(sql)



ms = MSSQL(host="172.30.0.186",user="sa",pwd="",db="test")
fengefu = '$%$'
for i in range(1, len(sys.argv)):
    read = open(sys.argv[i] ,'r')
    for line in read:
        line=line.strip('\n')  
        data = line.split(fengefu)
        insertToCloseList(data,ms)
    read.close

sys.argv[0] 儲存的是py檔案自身的路徑,故接受引數從sys.argv[1]開始。