Подтвердить что ты не робот

Небуферизованное чтение из процесса с использованием подпроцесса в Python

Я пытаюсь прочитать из процесса, который производит длительный и трудоемкий вывод. Тем не менее, я хочу поймать его вывод как и когда он будет создан. Но использование чего-то вроде следующего похоже на буферизацию вывода команды, поэтому я получаю сразу все выходные строки:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
    for line in p.stdout:
        print line

Я пытаюсь сделать это на MacOS 10.5

4b9b3361

Ответ 1

Итератор файлов выполняет внутреннюю буферизацию самостоятельно. Попробуйте следующее:

line = p.stdout.readline()
while line:
    print line
    line = p.stdout.readline()

Ответ 2

Обычно каждая программа будет делать больше буферизации на своих входных и/или выходных каналах, чем вы, кажется, хотите... если только не обманывается, полагая, что этот канал фактически является терминалом!

Для этого нужно использовать pexpect - он отлично работает на Mac (жизнь сложнее в Windows, хотя есть решения, которые могут помочь даже там - к счастью, нам не нужно останавливаться на них, поскольку вы используете Mac вместо этого).