Ich versuche, einen Systemaufruf in Python durchzuführen und die Ausgabe in einer Zeichenfolge zu speichern, die ich im Python-Programm bearbeiten kann.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Ich habe ein paar Dinge ausprobiert, einschließlich einiger Vorschläge hier:
Abrufen der Ausgabe von subprocess.call ()
aber ohne Glück.
python
subprocess
Kennzeichen
quelle
quelle
"ntpq -p"
, was ein anderer Teil von ist das Problem, als Sie fragen.Antworten:
In Python 2.7 oder Python 3
Anstatt ein
Popen
Objekt direkt zu erstellen, können Sie diesubprocess.check_output()
Funktion verwenden , um die Ausgabe eines Befehls in einer Zeichenfolge zu speichern:In Python 2.4-2.6
Verwenden Sie die
communicate
Methode.out
ist was du willst.Wichtiger Hinweis zu den anderen Antworten
Beachten Sie, wie ich den Befehl übergeben habe. Das
"ntpq -p"
Beispiel bringt eine andere Sache auf. DaPopen
die Shell nicht aufgerufen wird, würden Sie eine Liste der Befehle und Optionen verwenden["ntpq", "-p"]
.quelle
Popen.communicate
wird erst zurückgegeben, wenn der Prozess beendet wurde.p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
gibt einbytes
Objekt zurück, nicht einstr
. Wenn Sie nur das Ergebnis drucken möchten, macht dies keinen Unterschied. Wenn Sie jedoch eine Methode wiemyString.split("\n")
das Ergebnis verwenden möchten , müssen Sie zuerst dasbytes
Objekt dekodieren :subprocess.check_output(myParams).decode("utf-8")
zum Beispiel.universal_newlines=True
als Parameter hat mir in Python 3 geholfen, das String-Objekt zu erhalten. Wenn universal_newlines True ist, werden sie im Textmodus mit Standardcodierung geöffnet. Andernfalls werden sie als binäre Streams geöffnet.Dies funktionierte bei mir für die Umleitung von stdout (stderr kann ähnlich behandelt werden):
Wenn es bei Ihnen nicht funktioniert, geben Sie bitte genau das Problem an, das Sie haben.
quelle
\n
.pipe.returncode == 0
nach der letzten Zeile überprüfen .Popen
ein Tupel vonstdout
und zurückgegebenstderr
wird. Wenn Sie also darauf zugreifen[0]
, greifen Sie einfach zustdout
. Sie könnten auch tuntext, err = pipe.communicate()
und werden danntext
haben, was Sie erwartenAngenommen, dies
pwd
ist nur ein Beispiel, so können Sie es tun:Ein weiteres Beispiel und weitere Informationen finden Sie in der Dokumentation zum Unterprozess .
quelle
subprocess.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
Im Popen Konstruktor, wenn Shell ist wahr , sollten Sie den Befehl als String und nicht als Folge passieren. Andernfalls teilen Sie den Befehl einfach in eine Liste auf:
Wenn Sie auch den Standardfehler in die Popen-Initialisierung einlesen müssen, können Sie stderr auf subprocess.PIPE oder subprocess.STDOUT setzen :
quelle
Für Python 2.7+ lautet die idiomatische Antwort:
subprocess.check_output()
Sie sollten auch die Behandlung von Argumenten beim Aufrufen eines Unterprozesses beachten, da dies etwas verwirrend sein kann.
Wenn args nur ein einzelner Befehl ohne eigene Argumente ist (oder Sie festgelegt haben
shell=True
), kann es sich um eine Zeichenfolge handeln. Ansonsten muss es eine Liste sein.Zum Beispiel ... um den
ls
Befehl aufzurufen , ist dies in Ordnung:also das ist:
Wenn Sie jedoch einige Argumente an den Shell-Befehl übergeben möchten, können Sie dies nicht tun:
Stattdessen müssen Sie es als Liste übergeben:
Die
shlex.split()
Funktion kann manchmal nützlich sein, um einen String in eine Shell-ähnliche Syntax aufzuteilen, bevor Unterprozesse erstellt werden ... wie folgt:quelle
Das funktioniert perfekt für mich:
quelle
Das war perfekt für mich. Sie erhalten den Rückkehrcode stdout und stderr in einem Tupel.
Beispielsweise:
quelle
Die akzeptierte Antwort ist immer noch gut, nur ein paar Anmerkungen zu neueren Funktionen. Da Python 3.6, können Sie kodieren , direkt in Griff
check_output
, siehe Dokumentation . Dies gibt jetzt ein String-Objekt zurück:In Python 3.7
capture_output
wurde subprocess.run () ein Parameter hinzugefügt, der einen Teil der Popen / PIPE-Behandlung für uns übernimmt. Weitere Informationen finden Sie in den Python-Dokumenten :quelle
In diesem Fall haben Sie nur ein Element in der Liste.
quelle
os.popen
ist zugunsten dessubprocess
Moduls veraltet .Ich habe eine kleine Funktion geschrieben, die auf den anderen Antworten hier basiert:
Verwendungszweck:
quelle
In Python 3.7 wurde ein neues Schlüsselwortargument
capture_output
für eingeführtsubprocess.run
. Kurz und einfach aktivieren:quelle
Dies ist eine einzeilige Lösung
quelle
Im Folgenden werden stdout und stderr des Prozesses in einer einzelnen Variablen erfasst. Es ist Python 2 und 3 kompatibel:
Wenn Ihr Befehl eher eine Zeichenfolge als ein Array ist, stellen Sie Folgendes voran:
quelle
Für Python 3.5 habe ich eine Funktion basierend auf der vorherigen Antwort eingerichtet. Protokoll kann entfernt werden, fand es schön zu haben
quelle
Verwenden Sie die
ckeck_output
Methode vonsubprocess
Zum Schluss analysieren Sie die Zeichenfolge
Hoffe es hilft, fröhliche Codierung
quelle