1. 程式人生 > >subprocess監控子程序的指令碼執行

subprocess監控子程序的指令碼執行

 subprocess執行指令碼

         在執行命令時,在Linux平臺,shell=True,否則會報出找不到檔案的錯誤。shell=True,表示採用作業系統命令終端方式處理。

3.2.1 常用函式

         函式名:call

         定義:subprocess.call(args, *, stdin=None,stdout=None, stderr=None, shell=False)

         示例:subprocess.call("dir",shell=True)

說明:1 如果shell=True不寫入,在windows下無法瀏覽目錄。2 需要

pipe通訊時,儘量不要用stdoutstderr,容易造成call啟動的程序死鎖。需要pipe時,可以用Popen函式。

函式名:check_call

定義:subprocess.check_call(args,*, stdin=None, stdout=None, stderr=None, shell=False)

         示例:subprocess.check_call("dir",shell=True)

說明:執行結果合call函式一樣,從使用方式和結果,沒有看到差異。僅在指令不存在時,會處理異常subprocess.CalledProcessError。

函式名:check_output

定義:subprocess.check_output(args,*, stdin=None, stdout=None, stderr=None, shell=False)

         示例:subprocess.check_output ("dir",shell=True)

說明:執行結果合call函式一樣,從使用方式和結果,沒有看到差異。僅在指令不存在時,會處理異常subprocess.CalledProcessError。

3.2.2 subprocess.Popen函式

         利用Popen函式執行指令碼,可以實時獲取新程序的輸出流。如下面程式碼:

def runPython
(self, script, reportDict):     pyPath = script[Schedule.Key_ScriptPath]     cmd_line = ["python", pyPath]     print "cmd:", cmd_line     try:         self.cmdP = Popen(cmd_line, stdout=subprocess.PIPE, shell=True)     except Exception,e:         print e.message     result = PyRunner.INIT_RESULT     #print "self.cmdP.poll():", self.cmdP.poll()     while (self.cmdP.poll() == None) or (self.cmdP.poll() <> 0):         #print p.poll()         line= self.cmdP.stdout.readline()         #print line         # 解析測試指令碼通訊指令         if (line.startswith(PyRunner.SUBP_CMD_HEAD)):             self.parseScriptCMD(line,script,reportDict)
         這個例子,是執行python指令碼。需要獲取python指令碼執行情況,直接採集python指令碼中print輸出的日誌,可以進行分析。