Wie kann ich ein externes Programm mit einem Python-Skript aufrufen und den Ausgabe- und Rückgabecode abrufen?Wie ein externes Programm in Python aufrufen und den Ausgabe- und Rückgabecode abrufen?
Antwort
Blick auf das subprocess-Modul: 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 zu reflektieren, falls jemand das tut lese die Kommentare nicht und verwende den zuvor falschen Code. –
Wenn dies aus irgendeinem Grund nicht funktioniert, möchten Sie möglicherweise Shell = True zu den Parametern hinzufügen (wenn in Windows?) – ntg
Es scheint, dass [die obige Lösung] (https://stackoverflow.com/a/707001/1321680) kann durch einfachen Aufruf ['subprocess.run()'] (https://docs.python.org/dev/library/subprocess.html#subprocess.run) ersetzt werden (Python> = 3.5 ist erforderlich). –
Schauen Sie sich die Subprozess Modul hier: http://docs.python.org/library/subprocess.html#module-subprocess. Es sollte bekommen, was Sie tun müssen.
Nach Ambroz Bizjak der vorherigen Kommentar, hier ist eine Lösung, die für mich gearbeitet:
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
Ich habe einen ähnlichen Beitrag [hier] (https://stackoverflow.com/questions/1996518/retrieving-the-output-of-subprocess-call/21000308#21000308), die zeigt, wie man drei Dinge aus einem Prozess zu bekommen: Exitcode , stdout, stderr. – Jabba
Nach einigen Recherchen habe ich den folgenden Code, die für mich sehr gut funktioniert. Es druckt grundsätzlich sowohl stdout als auch stderr in Echtzeit. Ich hoffe, es hilft jemandem, 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 eine kleine Bibliothek (py-execute) entwickelt, die Sie externe Programme ausführen können, rufen Sie die Ausgabe und die retcode und zugleich Ausgabe in der Konsole in Echtzeit erhalten:
>>> from py_execute.process_executor import execute
>>> ret = execute('echo "Hello"')
Hello
>>> ret
(0, 'Hello\n')
Sie Druck vermeiden kann ein Mock user_io zu trösten vorbei:
>>> from mock import Mock
>>> execute('echo "Hello"', ui=Mock())
(0, 'Hello\n')
schrieb ich es, weil mit einfachen Popen (In Python 2.7) ich Probleme Ausführung comm aufweist, wurde ands mit einer langen Ausgabe
- 1. ein externes Programm aus Python aufrufen
- 2. Argc und argv für externes Programm aufrufen C shared library
- 3. geöffnet und ein externes Programm von Delphi
- 4. Wie kann ich ein externes Programm von C ausführen und seine Ausgabe analysieren?
- 5. Rufen Sie ein externes Programm in OCaml
- 6. Python: Wie führe ich ein externes Programm aus?
- 7. Externes Shell-Skript von PHP aufrufen und Prozess-ID
- 8. Wie starte ich ein externes Programm und bekomme den Return-Code in einem Firefox-Addon
- 9. Setup-Projekt VS2005 und externes Programm ausführen
- 10. Programm im Hintergrund ausführen, UND Rückgabecode erfassen (PHP & Windows)
- 11. Python: externe Programm ausführen und direkte Ausgabe in Datei und warten auf Ende
- 12. Führen Sie ein externes Programm innerhalb eines groovigen Skripts aus und erfassen Sie die Ausgabe
- 13. Wie erhalten Sie sowohl den Rückgabecode als auch die Ausgabe vom Subprozess in Python?
- 14. Abrufen des Rückgabewerts eines Python-Skripts
- 15. Bash Ignorierfehler und Rückgabecode erhalten
- 16. So rufen Sie ein externes Programm mit Parametern auf?
- 17. Wie starten und starten Sie ein externes Skript im Hintergrund?
- 18. Wie führe ich ein externes Programm von Julia aus und warte bis es fertig ist, dann lese seine Ausgabe
- 19. Rückgabecode speichern und es in bash Rückkehr
- 20. Kann ein Programm in C ein Bashscript im Hintergrund erzeugen und aufrufen und Argumente parsen?
- 21. C externes Programm ausführen und das Ergebnis erhalten
- 22. Kann ich ein externes Skript oder Programm beim Erstellen einer SWF-Datei in Flash CS3 aufrufen?
- 23. Wie führe ich ein externes Programm von Swift aus?
- 24. Wie erkennt man ein externes Programm, das Ihren Prozess überwacht?
- 25. Kommunikation zwischen Racket-Programm und Python-Programm
- 26. Tail-Ausgabe in ein Programm umleiten
- 27. Wie Java-Programm ausführen und Ausgabe in PHP erhalten?
- 28. Wie verwende ich ein beliebiges externes Programm als Filter in einem Perl-Programm?
- 29. Inhaltsdateien und primäre Ausgabe programmgesteuert abrufen
- 30. Wie erhalten Sie den Rückgabecode des Testbefehls in der Shell?
Es gibt einige bestehende Fragen und Antworten zu SO, die Ihnen helfen werden: http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python –
Mögliche doppelte von [Aufruf eines externen Befehls in Python] (http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) –