последовательно отправить стандартный вывод из подпроцесса. Открыть через сокет - PullRequest
2 голосов
/ 22 сентября 2011

Я знаю, что на это уже отвечали много раз, но я не нашел подходящего способа сделать это в моем сценарии ... Я надеюсь, что вы поможете. Я хочу выводить данные из stdout и / или stderr из вызова Popen в режиме реального времени, в сокетное соединение, а не в stdout. Так что sys.stdout.flush () не работает для меня. </p> <pre class="lang-py prettyprint-override"><code>data=sok.recv(512) #the command to execute p = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE stderr=subprocess.PIPE) #this work.. but not how i spected, if the subprocess ends too fast, i only get the first line while p.poll() is None: sok.send(p.stdout.readline()) #this only send the last line for i in p.stdout.readline(): sok.send(i) sys.stdout.flush() #why sys.stdout? i don't use it p.stdout.flush() #same result

1 Ответ

3 голосов
/ 22 сентября 2011

p.poll () указывает, выполняется ли процесс.Так что он возвращает false, как только программа завершается.Так что это не то, что вы должны проверять.

ваш код:

for i in p.stdout.readline():

читает одну строку и затем перебирает каждую букву в этой строке.Не то, что вы хотели.Используйте:

for i in p.stdout.readlines():

, который будет возвращать каждую строку.

Но это прочитает весь файл перед созданием каких-либо строк, вероятно, не того, что вы хотели.

Поэтому используйте:

for line in p.stdout:

Что должно давать вам каждую строку, строку за строкой, пока больше нечего читать

...