Wie kann ich ein externes Programm mit einem Python-Skript aufrufen und die Ausgabe und den Rückgabecode abrufen?
Wie rufe ich ein externes Programm in Python auf und rufe den Ausgabe- und Rückgabecode ab?
jkp
Schaue auf die Teilprozess Modul: Es folgt ein einfaches Beispiel…
from subprocess import Popen, PIPE
process = Popen(["ls", "-la", "."], stdout=PIPE)
(output, err) = process.communicate()
exit_code = process.wait()
-
Ich habe die obige Antwort bearbeitet, um den Vorschlag von Ambroz widerzuspiegeln, falls jemand die Kommentare nicht liest und den zuvor falschen Code verwendet.
– Ben McCann
24. Oktober 13 um 17:30 Uhr
-
Wenn dies aus irgendeinem Grund nicht funktioniert, möchten Sie vielleicht shell=True zu den Parametern hinzufügen (wenn in Windows?)
– ntg
31. Oktober 16 um 10:05 Uhr
-
Es scheint, dass die obige Lösung durch einen einfachen Anruf ersetzt werden kann
subprocess.run()
(Python >= 3.5 ist erforderlich).– patryk.beza
24. Juni 17 um 12:56 Uhr
-
kann ich die Zeilennummer der Fehlerzeile erhalten, als hätte eine Zeile einen Fehler und die Funktion gibt mir die Zeilennummer wie 1.0 zurück? damit ich ein Tag hinzufügen und den Fehler hervorheben kann.
– Kumar Septam
15. Mai ’19 um 16:19 Uhr
-
Um die Fehlerausgaben zu erfassen, sollte auch “stderr=PIPE” hinzugefügt werden:
process = Popen(["ls", "-la", "."], stdout=PIPE, stderr=PIPE)
– HmT
31. Mai ’19 um 7:18 Uhr
Nach dem vorherigen Kommentar von Ambroz Bizjak ist hier eine Lösung, die für mich funktioniert hat:
import shlex
from subprocess import Popen, PIPE
cmd = "..."
process = Popen(shlex.split(cmd), stdout=PIPE)
process.communicate()
exit_code = process.wait()
-
Dies ist bei weitem die beste Antwort.
– dotancohen
22. August 13 um 9:43 Uhr
-
Ich habe hier einen ähnlichen Beitrag, der zeigt, wie man drei Dinge aus einem Prozess bekommt: Exitcode, stdout, stderr.
– Jabba
18. März 14 um 20:58 Uhr
Nach einiger Recherche habe ich den folgenden Code, der für mich sehr gut funktioniert. Es druckt grundsätzlich sowohl stdout als auch stderr in Echtzeit. Hoffe, es hilft jemand anderem, der es braucht.
stdout_result = 1
stderr_result = 1
def stdout_thread(pipe):
global stdout_result
while True:
out = pipe.stdout.read(1)
stdout_result = pipe.poll()
if out == '' and stdout_result is not None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
def stderr_thread(pipe):
global stderr_result
while True:
err = pipe.stderr.read(1)
stderr_result = pipe.poll()
if err == '' and stderr_result is not None:
break
if err != '':
sys.stdout.write(err)
sys.stdout.flush()
def exec_command(command, cwd=None):
if cwd is not None:
print '[' + ' '.join(command) + '] in ' + cwd
else:
print '[' + ' '.join(command) + ']'
p = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd
)
out_thread = threading.Thread(name="stdout_thread", target=stdout_thread, args=(p,))
err_thread = threading.Thread(name="stderr_thread", target=stderr_thread, args=(p,))
err_thread.start()
out_thread.start()
out_thread.join()
err_thread.join()
return stdout_result + stderr_result
-
Ich habe den Code nur kopiert und eingefügt, um zu sehen, ob er funktioniert, und ich habe eine Fehlermeldung erhalten
out
ist vom Typbytes
kann also nicht verwendet werdenwrite
Methode. Außerdem druckt es die Zeichen, hört aber nie auf.– Ashrasmun
Vor 2 Tagen
Ich habe eine kleine Bibliothek entwickelt (py-execute), mit der Sie externe Programme ausführen, die Ausgabe und den Retcode abrufen und gleichzeitig die Ausgabe in Echtzeit in der Konsole erhalten können:
>>> from py_execute.process_executor import execute
>>> ret = execute('echo "Hello"')
Hello
>>> ret
(0, 'Hellon')
Sie können vermeiden, an die Konsole zu drucken, indem Sie ein Schein-user_io übergeben:
>>> from mock import Mock
>>> execute('echo "Hello"', ui=Mock())
(0, 'Hellon')
Ich habe es geschrieben, weil ich mit einfachem Popen (in Python 2.7) Probleme hatte, Befehle mit einer langen Ausgabe auszuführen
.
Es gibt einige bestehende Fragen und Antworten zu SO, die Ihnen helfen werden: stackoverflow.com/questions/89228/…
– Jarret Hardie
1. April 09 um 19:27 Uhr
Beantwortet das deine Frage? Wie führe ich ein Programm aus oder rufe einen Systembefehl auf?
– Robertspierre
20. November 21 um 10:33 Uhr