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 需要
函式名: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這個例子,是執行python指令碼。需要獲取python指令碼執行情況,直接採集python指令碼中print輸出的日誌,可以進行分析。(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)