Вы можете создать пару tty для подпроцесса и запустить внутри нее. Согласно стандарту C (C99 7.19.3) единственный стандартный вывод - это буферизация строки (в отличие от полной буферизации, что, как вы говорите, вы не хотите), это когда это терминал. (или ребенок вызвал setvbuf (), очевидно).
Проверьте os.openpty ().
непроверенный код:
master, slave = os.openpty()
pid = os.fork()
if pid == 0:
os.close(master)
os.dup2(slave, 0)
os.dup2(slave, 1)
os.dup2(slave, 2)
os.execv("/usr/sbin/traceroute", ("traceroute","4.2.2.1"))
# FIXME: log error somewhere
os.exit(1)
os.close(slave)
while True:
d = os.read(master)
if len(d) == 0:
break
print d
os.waitpid(pid, 0)
Обратите внимание, что при вызове setvbuf () дочернего процесса (сразу после fork ()) не будет работать, поскольку setvbuf () является функцией libc, а не системным вызовом. Он просто изменяет состояние текущего вывода процесса, который будет перезаписан при вызове exec при загрузке нового двоичного файла.