python腳本監控程序問題&解決

一、如下兩段代碼區別?python

child = subprocess.Popen(command)
child = subprocess.Popen(command,
                                     stderr=subprocess.STDOUT,  # 表示子進程的標準錯誤
                                     stdout=subprocess.PIPE  # 表示須要程序標準輸出
                                     )

加上stdout參數,能夠獲取command命令執行的子進程的標準輸出,這有利於監控子進程執行狀況。shell

二、read爲何會出現deadlock?windows

stdout.read出現死鎖並阻塞的緣由:函數

解決辦法:用communicate()代替.net

三、communicate的返回結果(out, err)都表明什麼?3d

out, err = child.communicate()

communicate()函數有兩個返回值,因此須要用兩個變量來接收。out和err分別是標準輸出內容和標準錯誤內容。code

四、subprocess.call和subprocess.Popen區別聯繫(參考Python Popen communicate() 和wait()使用上的區別blog

當你對shell命令的輸出不感興趣,只但願程序被運行,你能夠典型的使用subprocess.call。若是你須要捕獲命令的輸出結果,那麼你就須要使用subprocess.Popen。
在subprocess.call與Popen之間,存在一個很是大的區別。subprocess.call會封鎖對響應的等待,而subprocess.Popen則不會。(能夠理解爲若是程或者子進程沒有響應,.call不理它,繼續執行python語句,而Popen會等待,直到子進程輸出結果才執行下一步語句)進程

五、python和pythonw區別聯繫get

若是不想看到控制檯,就用pythonw.exe來運行py,或者將.py改成.pyw。

這裏咱們遇到了一個問題就是:不能正常的運行pythonw

解決辦法:在pyw文件中添加如下代碼

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")

六、child.poll()一直輸出none?

開啓的child子程序的問題,檢查子程序是否正常便可。

七、popen(command,stderr,stdout)幾個參數都表明了什麼?

見問題一

 

參考資料:.pyw and pythonw does not run under Windows 7

pythonw.exe or python.exe?

擴展名改成pyw後沒法運行的問題記錄

相關文章
相關標籤/搜索