438 Stimmen

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

Ich möchte die Ausgabe eines Befehls zuweisen, den ich mit os.system auf eine Variable übertragen und verhindern, dass sie auf dem Bildschirm ausgegeben wird. Im folgenden Code wird die Ausgabe jedoch an den Bildschirm gesendet und der Wert für var ist 0, was wohl bedeutet, dass 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

656voto

Chris Bunch Punkte 83897

Von " Äquivalent von Bash-Backticks in Python ", nach dem ich vor langer Zeit gefragt habe, können Sie Folgendes verwenden popen :

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

Von der Dokumentationen für Python 3.6 ,

Dies wird mit subprocess.Popen implementiert; siehe die Klasse Dokumentation für leistungsfähigere Möglichkeiten zur Verwaltung und Kommunikation mit Subprozessen.


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

241voto

Walter Mundt Punkte 23839

Sie sollten sich auch die subprocess Modul, das entwickelt wurde, um die gesamte Familie der Python popen -Aufrufe.

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

Der Vorteil ist die große Flexibilität beim Aufrufen von Befehlen, beim Anschluss der Standard-Eingangs-/Ausgangs-/Fehlerströme usw.

48voto

ianmclaury Punkte 1158

Das Kommandomodul ist eine relativ einfache Möglichkeit, dies zu tun:

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

status ist 0, die Ausgabe ist der Inhalt von /etc/services.

45voto

chtenb Punkte 13189

Für Python 3.5+ wird empfohlen, dass Sie die Funktion aus dem Unterprozessmodul ausführen . Dies gibt eine CompletedProcess Objekt, aus dem Sie leicht die Ausgabe und den Rückgabewert ablesen 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"])

36voto

Vasili Syrakis Punkte 8886

Ich weiß, dass diese Frage bereits beantwortet wurde, aber ich wollte eine potenziell besser aussehende Möglichkeit vorstellen, Popen über die Verwendung von 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')

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