2010-07-07 13 views
7

Normalerweise kann ich stdout in Python ändern, indem Sie den Wert sys.stdout ändern. Dies scheint jedoch nur print Aussagen zu beeinflussen. Also, gibt es eine Möglichkeit, die Ausgabe (zur Konsole) eines Programms zu unterdrücken, das über den Befehl os.system() in Python ausgeführt wird?Umleitung stdio von einem Befehl in os.system() in Python

Antwort

14

Sie könnten das Programm über subprocess.Popen mit subprocess.PIPE Kommunikation ausführen, und dann schieben Sie diese Ausgabe wo immer Sie möchten, aber wie es ist, nur os.system läuft nur den Befehl, und nichts anderes.

from subprocess import Popen, PIPE 

p = Popen(['command', 'and', 'args'], stdout=PIPE, stderr=PIPE, stdin=PIPE) 

output = p.stdout.read() 
p.stdin.write(input) 

Viel flexibler meiner Meinung nach. Sie könnten bei der vollständigen Dokumentation aussehen wollen: Python Subprocess module

+0

Mmm ... okay. Also wird der Befehl auf der Zeile P = Popen (...) ausgeführt, ja? Und es zeigt nur die Ausgabe beim Aufruf von p.stdout.read() ... ja? Vielen Dank –

+0

Okay ... die Befehle haben ausgeführt, aber in einem separaten Thread. Kann ich das Programm während der Ausführung der Befehle entweder verfolgen oder im selben Thread behalten? Vielen Dank. –

+2

Verwenden Sie einfach p.wait(). Dies kann jedoch zu einem Deadlock führen, wenn PIPE stdout verwendet wird, wenn das Programm genügend Output generiert. Siehe die vollständige Dokumentation unter http://docs.python.org/library/subprocess.html#subprocess.Popen.wait. Aber ich denke, es sollte funktionieren .. –

0

Umleiten stderr sowie stdout.

+1

, die nicht aus http://docs.python.org/library/os.html#process-management os.system (Befehl) den Job Zitat tun Führen Sie den Befehl (eine Zeichenfolge) in einer Untershell aus. Dies wird durch Aufrufen des Standard-C-Funktionssystems() implementiert und hat dieselben Einschränkungen. Änderungen an sys.stdin usw. werden nicht in der Umgebung des ausgeführten Befehls angezeigt. –

12

Auf einem Unix-System können Sie stderr und stdout als Teil des Befehls selbst nach/dev/null umleiten.

+1

Das funktioniert nur auf einem Unix-System –

+0

Ja, richtig. Antwort aktualisiert, um Verwirrung zu vermeiden. – ealdent

0

Wenn Sie die Konsole, die mit dem Python-Programm gestartet wird, vollständig entfernen möchten, können Sie sie mit der Erweiterung .pyw speichern.

Ich kann jedoch die Frage missverstehen.