Weisen Sie die Ausgabe von os.system einer Variablen zu und verhindern Sie, dass sie auf dem Bildschirm angezeigt wird [duplicate]
Lesezeit: 6 Minuten
John
Ich möchte die Ausgabe eines Befehls zuweisen, den ich mit ausführe os.system in eine Variable und verhindern die Ausgabe auf dem Bildschirm. Aber im folgenden Code wird die Ausgabe an den Bildschirm gesendet und der Wert für gedruckt var ist 0, was meiner Meinung nach anzeigt, ob der Befehl erfolgreich ausgeführt wurde oder nicht. Gibt es eine Möglichkeit, die Befehlsausgabe der Variablen zuzuweisen und auch zu verhindern, dass sie auf dem Bildschirm angezeigt wird?
var = os.system("cat /etc/services")
print var #Prints 0
Nicht verwenden os.system (Noch os.popengemäß der von Ihnen akzeptierten Antwort): use subprocess.Popenes ist Weg besser!
– Alex Martelli
17. August 2010 um 15:28 Uhr
@AlexMartelli, man kann keine komplexen Befehle (z. B. piped) in subprocess.Popen() verwenden, aber mit os.system kann man es
Dies wird mit subprocess.Popen implementiert; In der Dokumentation dieser Klasse finden Sie leistungsfähigere Methoden zum Verwalten und Kommunizieren mit Unterprozessen.
Beachten Sie, dass Walters subprocess.check_output Die Lösung ist näher an dem Pythonic-Einzeiler, nach dem Sie anscheinend suchen, solange Sie sich nicht darum kümmern stderr.
– chbraun
10. Dezember 2012 um 4:14 Uhr
@ChrisBunch Warum ist suprocess eine bessere Lösung als os.popen?
Ich stoße immer wieder darauf und frage mich jedes Mal, warum es besser ist, drei Zeilen komplizierten Code zu haben als eine Zeile offensichtlichen Codes?
– Ant6n
27. Juli 2016 um 14:36 Uhr
Sie sollten nicht nur (fast) nie verwenden shell=Trueaber es ist auch in diesem Fall falsch. shell=True macht das Hülse der Kindprozess eher als catAlso out und err sind die stdout/stderr der Hülse Prozess statt der cat Prozess
– villapx
22. Februar 2017 um 21:24 Uhr
Vielleicht möchten Sie sich auch die ansehen subprocess Modul, das gebaut wurde, um die gesamte Familie von Python zu ersetzen popen-Typ Anrufe.
Hinzufügen stderr=subprocess.STDOUT um auch Standardfehler zu erfassen
– Dolan Antenucci
3. Mai 2019 um 18:33 Uhr
Ich habe diese Methode mit verwendet Systeminformationen Befehl. Ausgabe war etwas böse so was b'\r\nHost Name: DIMUTH-LAPTOP\r\nOS Name: Microsoft Windows 10 Pro\r\nOS Version: 10.0.10240 N/A Build 10240\r\nOS Manufacturer: Microsoft Corporation
– Ghost21blade
25. September 2020 um 4:44 Uhr
Wie kann ich Zeile für Zeile drucken? weil die obige Ausgabe ein Durcheinander ist
– Ghost21blade
25. September 2020 um 4:47 Uhr
@ghost21blade, vielleicht solltest du dir das ansehen: output.decode("utf-8").split("\n") oder was auch immer Sie damit machen möchten. Sie müssen es zuerst in einen String umwandeln!
– Ausgebildeter Musiker
23. April um 13:03 Uhr
Das Befehlsmodul ist eine einigermaßen allgemeine Möglichkeit, dies zu tun:
Status ist 0, Ausgabe ist der Inhalt von /etc/services.
Zitat aus der Dokumentation des Befehlsmoduls: „Veraltet seit Version 2.6: Das Befehlsmodul wurde in Python 3 entfernt. Verwenden Sie stattdessen das Unterprozessmodul.“.
– Cristian Ciupitu
24. April 2013 um 14:12 Uhr
Sicher, es ist veraltet, aber manchmal möchten Sie einfach etwas schnell und einfach in ein paar Zeilen Code erledigen.
– fIwJlxSzAPHEZIl
28. Februar 2015 um 0:16 Uhr
@advocate Überprüfen Sie den Befehl check_output des Unterprozesses. Es ist schnell, einfach und wird nicht so schnell an Wert verlieren!
– Lukas Stanley
4. Juli 2015 um 17:45 Uhr
chtenb
Für Python 3.5+ wird empfohlen, dass Sie die verwenden run-Funktion aus dem subprocess-Modul. Dies gibt a zurück CompletedProcess -Objekt, von dem Sie problemlos die Ausgabe sowie den Rückgabecode erhalten können. Da Sie nur an der Ausgabe interessiert sind, können Sie einen Utility-Wrapper wie diesen schreiben.
from subprocess import PIPE, run
def out(command):
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
return result.stdout
my_output = out("echo hello world")
# Or
my_output = out(["echo", "hello world"])
Vasili Syrakis
Ich weiß, dass dies bereits beantwortet wurde, aber ich wollte eine möglicherweise besser aussehende Möglichkeit vorstellen, Popen über die Verwendung von anzurufen from x import x und Funktionen:
3 Jahre später hat es bei mir funktioniert. Ich warf dies in eine separate Datei namens cmd.pyund dann schrieb ich in meine Hauptdatei from cmd import cmdline und nach Bedarf verwendet.
– Tarife KA
17. Juli 2017 um 13:18 Uhr
Ich hatte das gleiche Problem mit os.system, das 0 zurückgab, aber ich habe diese Methode ausprobiert und sie funktioniert großartig! Und als Bonus sieht es schön und ordentlich aus 🙂 Danke!
– Sophie Muspratt
17. Januar 2019 um 10:41 Uhr
Ich mache es mit der temporären Datei os.system:
import tempfile,os
def readcmd(cmd):
ftmp = tempfile.NamedTemporaryFile(suffix='.out', prefix='tmp', delete=False)
fpath = ftmp.name
if os.name=="nt":
fpath = fpath.replace("https://stackoverflow.com/","\\") # forwin
ftmp.close()
os.system(cmd + " > " + fpath)
data = ""
with open(fpath, 'r') as file:
data = file.read()
file.close()
os.remove(fpath)
return data
3 Jahre später hat es bei mir funktioniert. Ich warf dies in eine separate Datei namens cmd.pyund dann schrieb ich in meine Hauptdatei from cmd import cmdline und nach Bedarf verwendet.
– Tarife KA
17. Juli 2017 um 13:18 Uhr
Ich hatte das gleiche Problem mit os.system, das 0 zurückgab, aber ich habe diese Methode ausprobiert und sie funktioniert großartig! Und als Bonus sieht es schön und ordentlich aus 🙂 Danke!
– Sophie Muspratt
17. Januar 2019 um 10:41 Uhr
Kearney Taaffe
Python 2.6 und 3 sagen ausdrücklich, dass Sie die Verwendung von PIPE für stdout und stderr vermeiden sollten.
Der richtige Weg ist
import subprocess
# must create a file object to store the output. Here we are getting
# the ssid we are connected to
outfile = open('/tmp/ssid', 'w');
status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile)
outfile.close()
# now operate on the file
11010600cookie-checkWeisen Sie die Ausgabe von os.system einer Variablen zu und verhindern Sie, dass sie auf dem Bildschirm angezeigt wird [duplicate]yes
Nicht verwenden
os.system
(Nochos.popen
gemäß der von Ihnen akzeptierten Antwort): usesubprocess.Popen
es ist Weg besser!– Alex Martelli
17. August 2010 um 15:28 Uhr
@AlexMartelli, man kann keine komplexen Befehle (z. B. piped) in subprocess.Popen() verwenden, aber mit os.system kann man es
– vak
25. Mai 2015 um 11:03 Uhr
@vak, natürlich kannst du Pipes &c w/ verwenden
subprocess.Popen
— einfach hinzufügenshell=True
!– Alex Martelli
26. Mai 2015 um 23:06 Uhr
@AlexMartelli
shell=True
ist (im Allgemeinen) eine sehr schlechte Idee! Sie müssen sich sehr sicher sein, was Sie ausführen 🙂– Ignacio Fernández
21. Juli 2016 um 14:20 Uhr
@AlexMartelli Es ist nicht sinnvoll zu sagen, dass etwas “viel besser” ist, ohne zu sagen, warum.
– Benutzer650261
1. März um 16:25 Uhr