оперативный подпроцесс. Popen через stdout и КАНАЛ

Я пытаюсь захватить 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
18
задан martineau 6 August 2017 в 15:58
поделиться

5 ответов

Ваш интерпретатор выполняет буферизацию. Добавьте вызов sys.stdout.flush () после оператора печати.

19
ответ дан 30 November 2019 в 06:25
поделиться
cmd = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
for line in cmd.stdout:
    print line.rstrip("\n")
1
ответ дан 30 November 2019 в 06:25
поделиться

Для получения вывода «в режиме реального времени», подпрокат не подходит, потому что он не может победить стратегии буферизации других процессов. Вот причина, по которой я всегда рекомендую, всякий раз, когда такое «в режиме реального времени», привлекая к схвативанию выхода (довольно частый вопрос о переполнении стека!), Использовать вместо этого PEXPECT (везде, но окна - на Windows, Wexpect ).

11
ответ дан 30 November 2019 в 06:25
поделиться

Снимите readleines (), который является объединением выхода. Также вам нужно обеспечить применение линейной буферизации, поскольку большинство команд будут взаимодействовать с наружной выходом на трубу. Подробнее см.: http://www.pixelbeat.org/programming/stdio_buffering/

3
ответ дан 30 November 2019 в 06:25
поделиться

Вызов на считывающие линии ждет выхода процесса. Замените это циклом вокруг cmd.stdout.readline() (примечание сингулярно) и все должно быть в порядке.

0
ответ дан 30 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: