Popen
ist nicht blockierend. call
und check_call
blockieren. Sie können die Popen
Instanz blockieren, indem Sie die Methode wait
oder communicate
aufrufen. Wenn Sie in the source code suchen, sehen Sie call
Anrufe Popen(...).wait()
, weshalb es blockiert. check_call
ruft call
, weshalb es auch blockiert.
Streng genommen ist shell=True
orthogonal zum Problem der Blockierung. shell=True
bewirkt jedoch, dass Python eine Shell ausführt und dann den Befehl in der Shell ausführt. Wenn Sie einen blockierenden Anruf verwenden, wird der Anruf zurückgegeben, wenn die Shell beendet wird. Da die Shell einen Unterprozess zur Ausführung des Befehls erzeugen kann, endet die Shell möglicherweise vor dem erzeugten Unterprozess. Zum Beispiel
import subprocess
import time
proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()
hier zwei Prozesse hervorgebracht: Popen laicht ein subprocess des Shell ausgeführt wird. Die Shell wiederum erzeugt einen Subprozess mit der Nummer ls
. proc.terminate()
tötet die Shell, aber der Subprozess, der ls
ausgeführt wird, bleibt. (Das zeigt sich an der umfangreichen Ausgabe, selbst nachdem das Python-Skript beendet wurde. Bereiten Sie sich darauf vor, die ls
mit pkill ls
zu töten.)
haben Sie versucht, 'subprocess.call ([cmd, params, &])' '? –