Wie rufe ich ein externes Programm in Python auf und rufe den Ausgabe- und Rückgabecode ab?

Lesezeit: 3 Minuten

Wie kann ich ein externes Programm mit einem Python-Skript aufrufen und die Ausgabe und den Rückgabecode abrufen?

  • 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

Wie rufe ich ein externes Programm in Python auf und
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 Typ bytes kann also nicht verwendet werden write 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

.

489310cookie-checkWie rufe ich ein externes Programm in Python auf und rufe den Ausgabe- und Rückgabecode ab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy