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.)

  • Senden von ^ C an Python-Unterprozessobjekte unter Windows
  • Rsync von python subprocess.call anrufen
  • Während eines Unterprozeßaufrufs fängst du fehlerhafte Fensterfehler in Python an, anstatt das OS damit zu verarbeiten, indem du böse Fehler-Pop-ups zeigst
  • Das Ausführen eines Befehls mit Zitaten in den Parametern funktioniert mit commands.getoutput (), aber nicht Subprozess-Modul
  • Rufen Sie das externe Programm von python an und erhalten Sie die Ausgabe
  • Python-Subprozess-Ausgabe auf Windows?
  • Ausgabe mit subprocess.Popen und Ausführung von ssh-Befehl
  • Wie lese ich das erste Byte eines Subprocess's Stdout und verwerfe dann den Rest in Python?
  • Python ist die beste Programmiersprache der Welt.