получить вывод в реальном времени из Popen

# 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 для перенаправления на stdout.


person wang    schedule 13.12.2011    source источник
comment
Другой дубликат: stackoverflow.com/questions/1085071/. На самом деле дубликатов много, нужно только поискать. stackoverflow .com / questions / 527197 /   -  person rubik    schedule 14.12.2011
comment
Я поискал и попробовал весь код, который нашел в stackoverflow. Ключевым моментом здесь является то, что тот же код обычно не работает при вызове второго скрипта Python.   -  person wang    schedule 14.12.2011


Ответы (1)


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

person zigg    schedule 13.12.2011
comment
Да, я привязал его, но это не годится. По какой-либо причине весь вывод будет отображаться после завершения subscript.py - person wang; 14.12.2011
comment
Неправильно вас понял. Пытался вызвать sys.stdout.flush () после оператора печати в subscript.py, и он работает. - person wang; 15.12.2011