Буферизация входного канала Python - PullRequest
0 голосов
/ 17 октября 2019

У меня проблемы с пониманием, почему input не печатает на стандартный вывод сразу после процесса дочернего разветвления. Вместо этого он ожидает, когда родительский файл запишет в свой канал (который должен отображаться в sys.stdin). Это как-то связано с буферизацией?

import os
import select
import sys

r, w = os.pipe()
pid = os.fork()

if pid:
    try:
        os.close(r)

        b = b''
        while True:
            ins, _, _ = select.select([sys.stdin], [], [], 1)
            if ins:
                d = os.read(0, 1)
                print('parent read', d)
                if d == b'\n':
                    break
                b += d
        print('parent writing', b)
        os.write(w, b)
    finally:
        os.close(w)
else:
    os.close(w)
    sys.stdin.close()
    sys.stdin = os.fdopen(r)
    print('asking for input')
    d = raw_input('Enter your input: ')
    print(d)
    sys.exit(0)

И вывод:

python2 p2.py
asking for input
a
('parent read', 'a')
('parent read', '\n')
('parent writing', 'a')
Enter your input: a

В то время как под python3 (изменяя raw_input на input) он работает как положено:

python3 test.py
asking for input
Enter your input: a
parent read b'a'
parent read b'\n'
parent writing b'a'
a
...