Ответ 1
Итератор файлов выполняет внутреннюю буферизацию самостоятельно. Попробуйте следующее:
line = p.stdout.readline()
while line:
print line
line = p.stdout.readline()
Я пытаюсь прочитать из процесса, который производит длительный и трудоемкий вывод. Тем не менее, я хочу поймать его вывод как и когда он будет создан. Но использование чего-то вроде следующего похоже на буферизацию вывода команды, поэтому я получаю сразу все выходные строки:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print line
Я пытаюсь сделать это на MacOS 10.5
Итератор файлов выполняет внутреннюю буферизацию самостоятельно. Попробуйте следующее:
line = p.stdout.readline()
while line:
print line
line = p.stdout.readline()
Обычно каждая программа будет делать больше буферизации на своих входных и/или выходных каналах, чем вы, кажется, хотите... если только не обманывается, полагая, что этот канал фактически является терминалом!
Для этого нужно использовать pexpect - он отлично работает на Mac (жизнь сложнее в Windows, хотя есть решения, которые могут помочь даже там - к счастью, нам не нужно останавливаться на них, поскольку вы используете Mac вместо этого).
Это была ошибка, которая исправлена в Python 2.6: http://bugs.python.org/issue3907