wake-up-neo.com

Wie rufe ich ein externes Programm in python und rufe den Ausgabe- und Rückkehrcode ab?

Wie kann ich ein externes Programm mit einem python Skript aufrufen und den Ausgabe- und Rückkehrcode abrufen?

48
cfischer

Schauen Sie sich den Unterprozess an: Es folgt ein einfaches Beispiel ...

from subprocess import Popen, PIPE

process = Popen(["ls", "-la", "."], stdout=PIPE)
(output, err) = process.communicate()
exit_code = process.wait()
64
jkp

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()
15
Jabba

Ich habe eine kleine Bibliothek ( py-execute ) entwickelt, 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, 'Hello\n')

Sie können vermeiden, an die Konsole zu drucken, indem Sie ein falsches user_io übergeben:

>>> from mock import Mock
>>> execute('echo "Hello"', ui=Mock())
(0, 'Hello\n')

Ich habe es geschrieben, weil ich mit Popen (In Python 2.7)) Probleme hatte, Befehle mit einer langen Ausgabe auszuführen

2
hithwen

Nach einigen Recherchen habe ich den folgenden Code, der für mich sehr gut funktioniert. Grundsätzlich werden sowohl stdout als auch stderr in Echtzeit gedruckt. 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
2
Jake W

Schauen Sie sich das Subprozessmodul hier an: http://docs.python.org/library/subprocess.html#module-subprocess . Es sollte erledigt werden, was Sie brauchen.

2
David Ackerman