Ваш пробег мая может, я попытался использовать @ senderle в решении Vartec в Windows на Python 2.6.5, но я получал ошибки, и никаких других решений не работало. Моя ошибка: WindowsError: [Error 6] The handle is invalid
.
Я обнаружил, что мне пришлось назначить PIPE каждому дескриптору, чтобы он возвращал результат, который я ожидал, - для меня это работало.
import subprocess
def run_command(cmd):
"""given shell command, returns communication tuple of stdout and stderr"""
return subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE).communicate()
и вызывайте так ( [0]
получает первый элемент кортежа, stdout
):
run_command('tracert 11.1.0.1')[0]
Узнав больше, я считаю, что мне нужны эти аргументы в трубке, потому что я работаю над настраиваемой системой, использующей разные дескрипторы , поэтому мне пришлось напрямую управлять всеми файлами std.
Чтобы остановить всплывающие окна консоли (с Windows), сделайте следующее:
def run_command(cmd):
"""given shell command, returns communication tuple of stdout and stderr"""
# instantiate a startupinfo obj:
startupinfo = subprocess.STARTUPINFO()
# set the use show window flag, might make conditional on being in Windows:
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
# pass as the startupinfo keyword argument:
return subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
startupinfo=startupinfo).communicate()
run_command('tracert 11.1.0.1')