Буферизация вашего долговременного подпроцесса, вероятно, приведет к тому, что ваша консоль выйдет из строя и очень плохой UX. Я предлагаю вам вместо этого использовать pexpect (или в Windows, wexpect), чтобы победить такую буферизацию и получить плавный регулярный вывод из подпроцесса. Например (на любой Unix-у системы, после установки pexpect):
>>> import pexpect
>>> child = pexpect.spawn('/bin/bash -c "echo ba; sleep 1; echo bu"', logfile=sys.stdout); x=child.expect(pexpect.EOF); child.close()
ba
bu
>>> child.before
'ba\r\nbu\r\n'
ба и бу будет идти с надлежащим выбором времени (около секунды между ними). Обратите внимание, что вывод не подлежит нормальной обработке терминалов, поэтому возвраты каретки остаются там - вам нужно будет постобработать строку самостоятельно (просто просто .replace
! -), если вам нужно \n
как конец строки маркеры (недостаток обработки важен только в том случае, если подпроцесс записывает двоичные данные в его stdout - это гарантирует, что все данные остаются нетронутыми!).
Дубликат: http://stackoverflow.com/questions/803265/getting-realtime-output-using-subprocess и http://webproverka.com/ : //stackoverflow.com/questions/874815/how-do-i-get-real-time-information-back-from-a-subprocess-popen-in-python-2-5 –
Связанный: [Python: чтение потоковой передачи input from subprocess.communicate()] (http://stackoverflow.com/a/17698359/4279) – jfs