Как уже говорилось, проблема в буферизации библиотеки stdio операторов типа printf, когда к процессу не подключен ни один терминал. В любом случае на платформе Windows есть способ обойти это. Аналогичное решение может быть и на других платформах.
В Windows вы можете принудительно создать новую консоль при создании процесса. Хорошо, что это может оставаться скрытым, поэтому вы никогда его не увидите (это делается с помощью shell = True внутри модуля подпроцесса).
cmd = subprocess.Popen('ls -l', shell=True, stdout=PIPE, creationflags=_winapi.CREATE_NEW_CONSOLE, bufsize=1, universal_newlines=True)
for line in cmd.stdout.readlines():
print line
или
Несколько более полное решение состоит в том, что вы явно устанавливаете параметры STARTUPINFO, которые предотвращают запуск нового и ненужного процесса оболочки cmd.exe, для которого shell = True сделал выше.
class PopenBackground(subprocess.Popen):
def __init__(self, *args, **kwargs):
si = kwargs.get('startupinfo', subprocess.STARTUPINFO())
si.dwFlags |= _winapi.STARTF_USESHOWWINDOW
si.wShowWindow = _winapi.SW_HIDE
kwargs['startupinfo'] = si
kwargs['creationflags'] = kwargs.get('creationflags', 0) | _winapi.CREATE_NEW_CONSOLE
kwargs['bufsize'] = 1
kwargs['universal_newlines'] = True
super(PopenBackground, self).__init__(*args, **kwargs)
process = PopenBackground(['ls', '-l'], stdout=subprocess.PIPE)
for line in cmd.stdout.readlines():
print line