Подпроцесс Python.Popen висит в «для l в p.stdout», пока p не завершится, почему? - PullRequest
2 голосов
/ 15 мая 2010

У меня есть этот код:

#!/usr/bin/python -u

localport = 9876

import sys, re, os
from subprocess import *

tun = Popen(["./newtunnel", "22", str(localport)], stdout=PIPE, stderr=STDOUT)

print "** Started tunnel, waiting to be ready ..."
for l in tun.stdout:
        sys.stdout.write(l)
        if re.search("Waiting for connection", l):
                print "** Ready for SSH !"
                break

"./newtunnel" не будет выходить, он будет постоянно выводить все больше и больше данных на стандартный вывод.Однако этот код не выдаст никакого вывода и просто продолжает ждать в tun.stdout.

Когда я внешне завершаю процесс newtunnel, он сбрасывает все данные в tun.stdout.Поэтому кажется, что я не могу получить данные из tun.stdout, пока он еще работает.

Почему это так?Как я могу получить информацию?

Обратите внимание, что по умолчанию размер буфера для Popen равен 0 (без буферизации).Я также могу указать bufsize = 0, но это ничего не меняет.

1 Ответ

2 голосов
/ 15 мая 2010

Хорошо, похоже, что это ошибка в Python: http://bugs.python.org/issue3907

Если я заменю строку

for l in tun.stdout:

от

while True:
    l = tun.stdout.readline()

тогда это работает именно так, как я хочу.

...