Python: как получить stdout после запуска ОС.система?



Я хочу получить stdout в переменной после выполнения os.system звонок.



давайте возьмем эту строку в качестве примера:



batcmd="dir"
result = os.system(batcmd)


result будет содержать код ошибки (stderr0 под Windows или 1 под некоторым linux для приведенного выше примера).



как я могу получить stdout для команды без использования перенаправления в команду?

595   4  

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

    Ничего не найдено.