получить в режиме реального времени вывод из Попен - PullRequest
0 голосов
/ 14 декабря 2011
# cmd = "python subscript.py"
cmd = "ping localhost -n 10"
ofile =open("C:\file.log","w")
sp = subprocess.Popen(cmd,bufsize = 1, stdout = subprocess.PIPE, stderr = subprocess.PIPE)

while True:
    sp.poll()
    line = sp.stdout.readline()
    #eline = sp.stderr.readline()
    if line:
        print line
        ofile.write(line)
    #if eline:
        # print eline
        # ofile.write(" ERROR: "+line)
    # if (line == "" and eline == ""):
    if (line == ""):
        break

Я пытаюсь получить вывод из подпроцесса и сохранить его в файл журнала, используя код выше. Это хорошо работает для ping localhost -n 10. Но, используя его для вызова subscript.py, я не могу получить вывод subscript.py в реальном времени. Я получу весь вывод после окончания subscript.py. любое предложение? Также я должен закомментировать eline = sp.stderr.readline(), чтобы заставить его работать. Любая идея, почему какой-то код не даст мне вывод в реальном времени subscript.py?

subscript.py:

import time
i=0
while (i<5):
    time.sleep(1)
    i += 1
    print "ouput:",i

Как упомянул Рубик, есть пара похожих вопросов, заданных ранее. Я перепробовал все, что нашел, и ни один из них не решил мою проблему. Надеюсь, кто-то может указать причину, по которой он не работает при вызове subscript.py.

редактировать: проблема здесь: вывод файла subscript.py не сбрасывался до самого завершения. также в файле subscript.py нет никакого stderr, поэтому вызов sp.stderr.readline () вызывает бесконечное ожидание. решение: сбросить вывод в subscript.py для всех stderr я просто использую stderr = subprocess.STDOUT для перенаправления на стандартный вывод.

1 Ответ

2 голосов
/ 14 декабря 2011

Вы пытались вызвать sys.stdout.flush() в своем подпроцессе после оператора print? Возможно, вы используете выходную буферизацию.

...