Weisen Sie die Ausgabe von os.system einer Variablen zu und verhindern Sie, dass sie auf dem Bildschirm angezeigt wird [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
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

    – vak

    25. Mai 2015 um 11:03 Uhr

  • @vak, natürlich kannst du Pipes &c w/ verwendensubprocess.Popen — einfach hinzufügen shell=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

Benutzer-Avatar
Chris Haufen

Von “Äquivalent von Bash Backticks in Python”, das ich vor langer Zeit gefragt habe, was Sie vielleicht verwenden möchten, ist popen:

os.popen('cat /etc/services').read()

Von dem docs für Python 3.6,

Dies wird mit subprocess.Popen implementiert; In der Dokumentation dieser Klasse finden Sie leistungsfähigere Methoden zum Verwalten und Kommunizieren mit Unterprozessen.


Hier ist der entsprechende Code für subprocess:

import subprocess

proc = subprocess.Popen(["cat", "/etc/services"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print "program output:", out

  • 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?

    – Martin Thoma

    29. März 2014 um 16:53 Uhr

  • Sie sollten (fast) nie verwenden shell=True. Sehen docs.python.org/3/library/…

    – dynmc

    5. September 2014 um 20:27 Uhr


  • 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.

import subprocess
output = subprocess.check_output("cat /etc/services", shell=True)

Der Vorteil ist, dass es eine Menge Flexibilität gibt, wie Sie Befehle aufrufen, wo die Standard-In/Out/Error-Streams verbunden sind usw.

  • Hinweis, check_output wurde mit Python 2.7 hinzugefügt docs.python.org/2.7/library/…

    – phyatt

    23. November 2015 um 21:06 Uhr

  • 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:

import commands
status, output = commands.getstatusoutput("cat /etc/services")

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


Benutzer-Avatar
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"])

Benutzer-Avatar
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:

from subprocess import PIPE, Popen


def cmdline(command):
    process = Popen(
        args=command,
        stdout=PIPE,
        shell=True
    )
    return process.communicate()[0]

print cmdline("cat /etc/services")
print cmdline('ls')
print cmdline('rpm -qa | grep "php"')
print cmdline('nslookup google.com')

  • 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

Benutzer-Avatar
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

1101060cookie-checkWeisen Sie die Ausgabe von os.system einer Variablen zu und verhindern Sie, dass sie auf dem Bildschirm angezeigt wird [duplicate]

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

Privacy policy