Ich möchte ein externes Programm von Python aus aufrufen. Ich habe beides benutzt Popen()
und das call()
zu tun.
Was ist der Unterschied zwischen den beiden?
Mein spezifisches Ziel ist es, den folgenden Befehl von Python aus auszuführen. Ich bin nicht sicher, wie Weiterleitungen funktionieren.
./my_script.sh > output
Ich habe die Dokumentation gelesen und es heißt, dass dies call()
eine Komfortfunktion oder eine Verknüpfungsfunktion ist. Verlieren wir Energie, wenn wir call()
statt verwenden Popen()
?
python
subprocess
popen
varunl
quelle
quelle
call()
scheint sehr klar zu sein. Können Sie ein Angebot oder einen Link angeben, damit wir wissen, worauf wir uns bei einer Antwort konzentrieren müssen?Antworten:
Es gibt zwei Möglichkeiten, die Umleitung durchzuführen. Beide gelten entweder für
subprocess.Popen
odersubprocess.call
.Setzen Sie das Schlüsselwortargument
shell = True
oderexecutable = /path/to/the/shell
und geben Sie den Befehl so an, wie Sie ihn dort haben.Da Sie die Ausgabe nur in eine Datei umleiten, legen Sie das Schlüsselwortargument fest
wo das Objekt auf die
output
Datei zeigt.subprocess.Popen
ist allgemeiner alssubprocess.call
.Popen
blockiert nicht, sodass Sie mit dem Prozess interagieren können, während er ausgeführt wird, oder mit anderen Dingen in Ihrem Python-Programm fortfahren können. Der Aufruf zumPopen
Zurückgeben einesPopen
Objekts.call
tut Block. Obwohl es dieselben Argumente wie derPopen
Konstruktor unterstützt, sodass Sie weiterhin die Ausgabe des Prozesses, Umgebungsvariablen usw. festlegen können, wartet Ihr Skript auf den Abschluss des Programms undcall
gibt einen Code zurück, der den Beendigungsstatus des Prozesses darstellt.ist im Grunde das gleiche wie anrufen
call
ist nur eine Komfortfunktion. Die Implementierung in CPython erfolgt in subprocess.py :Wie Sie sehen können, ist es eine dünne Hülle herum
Popen
.quelle
Die andere Antwort ist sehr vollständig, aber hier ist eine Faustregel:
call
blockiert:Popen
ist nicht blockierend:quelle