Dein Kilometerstand kann variieren. Ich habe @senderle's Variante von Vartec's Lösung unter Windows mit Python 2.6.5 ausprobiert, aber ich habe Fehlermeldungen erhalten, und keine anderen Lösungen haben funktioniert. Mein Fehler war: WindowsError: [Error 6] Der Handle ist ungültig
.
Ich fand heraus, dass ich PIPE jedem Handle zuweisen musste, um die erwartete Ausgabe zu erhalten - folgendes hat für mich funktioniert.
import subprocess
def run_command(cmd):
"""Gibt beim gegebenen Shell-Befehl ein Kommunikationstupel von stdout und stderr zurück"""
return subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE).communicate()
und rufe es wie folgt auf, ([0]
gibt das erste Element des Tupels, stdout
):
run_command('tracert 11.1.0.1')[0]
Nachdem ich mehr gelernt habe, glaube ich, dass ich diese Pipe-Argumente benötige, weil ich an einem benutzerdefinierten System arbeite, das verschiedene Handles verwendet, deshalb musste ich alle std's direkt steuern.
Um Konsolen-Popups zu stoppen (mit Windows), mache dies:
def run_command(cmd):
"""Gibt beim gegebenen Shell-Befehl ein Kommunikationstupel von stdout und stderr zurück"""
# Ein startupinfo-Objekt instanziieren:
startupinfo = subprocess.STARTUPINFO()
# Setze das Use-Show-Window-Flag, vielleicht bedingt auf Windows:
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
# Als das startupinfo-Schlüsselwortargument übergeben:
return subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
startupinfo=startupinfo).communicate()
run_command('tracert 11.1.0.1')