Python: как получить stdout после запуска ОС.система?
Я хочу получить stdout в переменной после выполнения os.system звонок.
давайте возьмем эту строку в качестве примера:
batcmd="dir"
result = os.system(batcmd)
result будет содержать код ошибки (stderr0 под Windows или 1 под некоторым linux для приведенного выше примера).
как я могу получить stdout для команды без использования перенаправления в команду?
4 ответов:
если все, что вам нужно-это
stdoutвыход, а затем взгляните наsubprocess.check_output()(добавил в Python 2.7):import subprocess batcmd="dir" result = subprocess.check_output(batcmd, shell=True)потому что вы используете
os.system(), вы должны были бы установитьshell=Trueчтобы получить такое же поведение. Вы действительно хотите прислушаться к Большое Красное предупреждающее сообщение о передаче ненадежных аргументов в вашу оболочку.Если вам нужно записать
stderrа также, просто добавитьstderr=subprocess.STDOUTвызов:result = subprocess.check_output([batcmd], stderr=subprocess.STDOUT)для перенаправления вывода ошибок к выходному потоку по умолчанию.
эти ответы не работает для меня. Я должен был использовать следующее:
import subprocess p = subprocess.Popen(["pwd"], stdout=subprocess.PIPE) out = p.stdout.read() print outили как функция (использование shell=True было необходимо для меня на Python 2.6.7 и check_output не был добавлен до 2.7, что делает его непригодным здесь):
def system_call(command): p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True) return p.stdout.read()
Я хотел бы расширить на решение Windows. Использование IDLE с Python 2.7.5, когда я запускаю этот код из файла Expts.py:
import subprocess r = subprocess.check_output('cmd.exe dir',shell=False) print r...в оболочке Python я получаю только вывод, соответствующий " cmd.exe"; часть " dir " игнорируется. Однако, когда я добавляю переключатель, такой как /K или /C ...
import subprocess r = subprocess.check_output('cmd.exe /K dir',shell=False) print r...затем в оболочке Python я получаю все, что ожидаю, включая список каталогов. Уууу !
Теперь, если я попробую любую из тех же вещей в DOS Python командное окно, без переключателя или с переключателем /K, похоже, что окно зависает, потому что оно запускает подпроцесс cmd.exe и он ожидает дальнейшего ввода типа "выход", а затем нажмите [enter], чтобы освободить. Но с переключателем /K он отлично работает и возвращает вас в приглашение python. Тогда все правильно.
пошел еще дальше...Я думал, что это круто...Когда я вместо этого делаю это в Expts.py:
import subprocess r = subprocess.call("cmd.exe dir",shell=False) print r...новое окно DOS открывается и остается показывать только результаты "cmd.exe "не из "Дир". Когда я добавляю переключатель /C, окно DOS открывается и закрывается очень быстро, прежде чем я смогу что-либо увидеть (как и ожидалось, потому что /C завершается после завершения). Когда я вместо этого добавляю переключатель /K, окно DOS открывается и остается, и я получаю все выходные данные, которые я ожидаю, включая список каталогов.
Если я попробую то же самое (подпроцесса.вызов вместо подпроцесса.check_output) из окна команды DOS Python; все выходные данные находятся в одном окне, нет всплывающие окна. Без коммутатора снова игнорируется часть "dir", и приглашение изменяется от приглашения python до приглашения DOS (начиная с cmd.подпроцесс exe выполняется в python; снова введите "exit", и вы вернетесь к приглашению python). Добавление параметра /K выводит список каталогов и изменяет приглашение с python на DOS, так как /K не завершает подпроцесс. Изменение переключателя на /C дает нам все ожидаемые выходные данные и возвращается к приглашению python с момента подпроцесса прекращается в соответствии с /С.
извините за длинный ответ, но я разочарован на этой доске многими краткими "ответами", которые в лучшем случае не работают (кажется, потому что они не тестируются - например, ответ Эдуарда F выше моего, который отсутствует переключатель) или, что еще хуже, настолько кратки, что они не очень помогают (например, " попробуйте подпроцесс вместо ОС.система"... да, хорошо, и что теперь ??). Напротив, я предоставил решения, которые я тестировал, и показал, как есть тонкие разница между ними. Потребовалось много времени, но..... Надеюсь, это поможет.
commandsтоже работает.import commands batcmd = "dir" result = commands.getoutput(batcmd) print resultон работает на linux, python 2.7.
Comments