1. 程式人生 > >python subprocess引數shell=True踩到的坑

python subprocess引數shell=True踩到的坑

0x01 問題現象

寫的程式使用subprocess建立子程序執行其他程式,判斷其他程式執行完後進行處理。
在subprocess使用了shell=True,判斷使用者程式退出的程式碼如下

while self.proc.poll() is None:
    do_something

判斷子程序是否執行結束,程式在子程序執行結束後,程式碼未向下繼續執行,而是卡在了這個迴圈中。

0x02 原因分析

百度後對shell引數的解釋如下:
shell=True引數會讓subprocess.Popen接受字串型別的變數作為命令,並呼叫shell去執行這個字串,當shell=False是,subprocess.Popen只接受陣列變數作為命令,並將陣列的第一個元素作為命令,剩下的全部作為該命令的引數。
通過檢視伺服器程序可以看到,仍然有程序存在,程序如下
這裡寫圖片描述

為shell中執行的程式,由此可以得出,shell=true時,子程序在執行完後,shell並沒有退出,而是卡在shell命令中,可由程序看到。

這裡寫圖片描述