Я пытаюсь захватить stdout
от a subprocess.Popen
звоните и хотя я достигаю этого легко путем выполнения:
cmd = subprocess.Popen('ls -l', shell=True, stdout=PIPE)
for line in cmd.stdout.readlines():
print line
Я хотел бы захватить stdout
в "реальное время". С вышеупомянутым методом PIPE ожидает для захвата весь stdout
и затем это возвращается.
Таким образом для входа целей, это не отвечает моим требованиям (например, "видит" то, что продолжается, в то время как это происходит).
Есть ли способ добраться линию за линией, stdout
в то время как работает? Или это ограничение subprocess
(имеющий необходимость ожидать до PIPE
завершения).
ОТРЕДАКТИРУЙТЕ, Если я переключаюсь readlines()
для readline()
Я только получаю последнюю строку stdout
(не идеальный):
In [75]: cmd = Popen('ls -l', shell=True, stdout=PIPE)
In [76]: for i in cmd.stdout.readline(): print i
....:
t
o
t
a
l
1
0
4
Ваш интерпретатор выполняет буферизацию. Добавьте вызов sys.stdout.flush () после оператора печати.
cmd = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
for line in cmd.stdout:
print line.rstrip("\n")
Для получения вывода «в режиме реального времени», подпрокат
не подходит, потому что он не может победить стратегии буферизации других процессов. Вот причина, по которой я всегда рекомендую, всякий раз, когда такое «в режиме реального времени», привлекая к схвативанию выхода (довольно частый вопрос о переполнении стека!), Использовать вместо этого PEXPECT (везде, но окна - на Windows, Wexpect ).
Снимите readleines (), который является объединением выхода. Также вам нужно обеспечить применение линейной буферизации, поскольку большинство команд будут взаимодействовать с наружной выходом на трубу. Подробнее см.: http://www.pixelbeat.org/programming/stdio_buffering/
Вызов на считывающие линии
ждет выхода процесса. Замените это циклом вокруг cmd.stdout.readline()
(примечание сингулярно) и все должно быть в порядке.