1464 Stimmen

Ausführen des Shell-Befehls und Erfassen der Ausgabe

Ich möchte eine Funktion schreiben, die ein Shell-Kommando ausführt und seine Ausgabe als String zurückgibt, unabhängig davon, ob es sich um eine Fehler- oder Erfolgsmeldung handelt. Ich möchte nur das gleiche Ergebnis erhalten, das ich mit der Befehlszeile erhalten hätte.

Was wäre ein Codebeispiel, das so etwas tun würde?

Zum Beispiel:

def run_command(cmd):
    # ??????

print run_command('mysqladmin create test -uroot -pmysqladmin12')
# Sollte etwas wie folgt ausgeben:
# mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'test'; database exists'

208voto

byte_array Punkte 2737

Dies ist viel einfacher, funktioniert aber nur auf Unix (einschließlich Cygwin) und Python 2.7.

import commands
print commands.getstatusoutput('wc -l file')

Es gibt ein Tupel mit dem (Rückgabewert, Ausgabe) zurück.

Für eine Lösung, die sowohl in Python 2 als auch in Python 3 funktioniert, verwenden Sie stattdessen das subprocess-Modul:

from subprocess import Popen, PIPE
output = Popen(["date"],stdout=PIPE)
response = output.communicate()
print response

177voto

azhar22k Punkte 3817

Ich hatte das gleiche Problem, aber ich habe einen sehr einfachen Weg gefunden, dies zu tun:

import subprocess
output = subprocess.getoutput("ls -l")
print(output)

Hoffe es hilft dir weiter

Hinweis: Diese Lösung ist spezifisch für Python3, da subprocess.getoutput() in Python2 nicht funktioniert

129voto

vartec Punkte 124396

So etwas in der Art:

def runProcess(exe):    
    p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while(True):
        # gibt None zurück, solange der Unterprozess läuft
        retcode = p.poll() 
        line = p.stdout.readline()
        yield line
        if retcode is not None:
            break

Beachten Sie, dass ich stderr auf stdout umleite. Das entspricht möglicherweise nicht genau Ihren Wünschen, aber ich möchte auch Fehlermeldungen erhalten.

Diese Funktion gibt Zeile für Zeile aus, wie sie kommen (normalerweise müssten Sie warten, bis der Unterprozess fertig ist, um die gesamte Ausgabe zu erhalten).

Für Ihren Fall würde die Verwendung so aussehen:

for line in runProcess('mysqladmin create test -uroot -pmysqladmin12'.split()):
    print line,

88voto

Mehdi Saman Booy Punkte 2572

Dies ist eine knifflige, aber super einfache Lösung, die in vielen Situationen funktioniert:

import os
os.system('beispiel_cmd > tmp')
print(open('tmp', 'r').read())

Eine temporäre Datei (hier tmp) wird mit der Ausgabe des Befehls erstellt und Sie können aus dieser Ihre gewünschte Ausgabe lesen.

Zusätzliche Anmerkung aus den Kommentaren: Sie können die tmp-Datei im Fall einer einmaligen Aufgabe löschen. Wenn Sie dies mehrmals tun müssen, ist es nicht notwendig, die tmp zu löschen.

os.remove('tmp')

78voto

Max Ekman Punkte 921

Vartecs Antwort liest nicht alle Zeilen, also habe ich eine Version erstellt, die das tut:

def run_command(command):
    p = subprocess.Popen(command,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    return iter(p.stdout.readline, b'')

Die Verwendung ist die gleiche wie bei der akzeptierten Antwort:

command = 'mysqladmin create test -uroot -pmysqladmin12'.split()
for line in run_command(command):
    print(line)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X