У меня есть общий вопрос о popen (и всех связанных функциях), применимый ко всем операционным системам, когда я пишу скрипт на python или некоторый код на c и запускаю полученный исполняемый файл из консоли (win или linux), я могу немедленно увидеть вывод из процесса. Однако, если я запускаю тот же исполняемый файл, что и разветвленный процесс с его stdout, перенаправленным в канал, выходные буферы куда-то, обычно до 4096 байтов, перед записью в канал, где родительский процесс может его прочитать.
Следующий скрипт Python сгенерирует выходные данные кусками по 1024 байта
import os, sys, time
if __name__ == "__main__":
dye = '@'*1024
for i in range (0,8):
print dye
time.sleep(1)
Следующий скрипт Python выполнит предыдущий скрипт и прочитает вывод, как только он попадет в канал, побайтово
import os, sys, subprocess, time, thread
if __name__ == "__main__":
execArgs = ["c:\\python25\\python.exe", "C:\\Scripts\\PythonScratch\\byte_stream.py"]
p = subprocess.Popen(execArgs, bufsize=0, stdout=subprocess.PIPE)
while p.returncode == None:
data = p.stdout.read(1)
sys.stdout.write(data)
p.poll()
Настройте путь для вашей операционной системы. При запуске в этой конфигурации выходные данные будут отображаться не порциями 1024, а порциями 4096, несмотря на то, что для размера буфера команды popen установлено значение 0 (в любом случае это значение по умолчанию). Может кто-нибудь сказать мне, как изменить это поведение ?, есть ли способ заставить операционную систему обрабатывать вывод от разветвленного процесса так же, как при запуске из консоли?, То есть просто передавать данные через без буферизации?