Blockieren und Nicht-Blockieren von Teilprozeßaufrufen

Ich bin völlig verwechselt zwischen subprocess.call() , subprocess.Popen() , subprocess.check_call() .

Was ist blockiert und was nicht?

Was ich sagen subprocess.Popen() , ist, wenn ich subprocess.Popen() benutze, ob der übergeordnete Prozess auf den Kindprozess wartet, um return / zu exit bevor er seine Ausführung beibehält.

Wie wirkt sich shell=True auf diese Anrufe aus?

One Solution collect form web for “Blockieren und Nicht-Blockieren von Teilprozeßaufrufen”

Popen ist nicht blockierend. call und check_call blockieren. Sie können den Popen Instanz-Block durch Aufruf der wait oder communicate .

Wenn du in den Quellcode schaust, wirst du Anrufrufe ansehen. Popen(...).wait() , weshalb es blockiert. check_call ruft check_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 Sperrruf verwenden, kehrt der Anruf zurück, wenn die Shell beendet ist. Da die Shell einen Unterprozeß hervorbringen kann, um den Befehl auszuführen, kann die Shell vor dem erzeugten Unterprozess beenden. Beispielsweise,

 import subprocess import time proc = subprocess.Popen('ls -lRa /', shell=True) time.sleep(3) proc.terminate() proc.wait() 

Hier werden zwei Prozesse hervorgebracht: Popen erzeugt einen Teilprozess, der die Shell ausführt. Die Schale erzeugt wiederum einen Unterprozeß, der ls läuft. proc.terminate() tötet die Shell, aber der Unterprozeß läuft ls bleibt. (Das ist manifestiert durch reichliche Ausgabe, auch nachdem das Python-Skript beendet ist. Sei bereit, das ls mit pkill ls zu töten.)

  • Python-Subprozess-Ausgabe auf Windows?
  • Python: Warum ruft echo mit subprocess zurück WindowsError 2?
  • Wie man Debugger an einen Python-Subprofi anhängt?
  • Find Befehl mit exec in python subprocess gibt Fehler
  • Python-Unterprozeßaufruf hängt
  • Python-Unterprozess und Benutzerinteraktion
  • Wickeln cmd.exe mit subprocess
  • Rsync von python subprocess.call anrufen
  • Python-Teilprozeß nimmt keine korrekten Argumente an
  • Python calling externe programme ohne öffnungskonsole (dos prompt) [duplizieren]
  • Warum ist python's subprocess.call so implementiert?
  • Python ist die beste Programmiersprache der Welt.