一、如下兩段代碼區別?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)幾個參數都表明了什麼?
見問題一