サブプロセスの標準出力を取得したい


親プロセスが子プロセスを起動し、子プロセスは親プロセスがコマンドを打つたびに結果を返す。  
コマンドと結果のやり取りは標準入出力で一行ずつやり取りする。  
ということを考えています。

次のような実験を行ったのですが、下のようなエラーが出てうまくいきません。どのようにすればよいでしょうか。

メイン:

[code]

    import subprocess
    import sys
    
    with subprocess.Popen(
        [sys.executable, "sub.py"],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        encoding="utf-8"
    ) as p:
        print("hoge", file=p.stdin)
        # TODO: 受け取り処理
    
[/code]

sub.py:

[code]

    from sys import stderr, stdin, stdout
    
    for line in stdin:
        # 通る 正常にファイルができる
        with open("out.txt", "a") as f:
            print(line, file=f)
    
        # 通る 正常にコンソールに表示される
        print(line, file=stderr)
    
        # 通らない
        print(line)
    
[/code]

エラー:

[code]

    Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp932'>        
    OSError: [Errno 22] Invalid argument
    
[/code]

環境:  
windows10  
python 3.9.5




pipe を `flush` するという方法もあるかと思います。

**main.py**

[code]

    import subprocess
    import sys
    
    with subprocess.Popen(
        [sys.executable, "sub.py"],
        stdin=subprocess.PIPE, stdout=subprocess.PIPE,
        encoding="utf-8",
    ) as p:
        for msg in ['hoge', 'fuga', 'piyo']:
            print(msg, file=p.stdin, flush=True)
            line = p.stdout.readline()
            print(line.strip())
    
[/code]

**sub.py**

[code]

    from sys import stderr, stdin, stdout
    
    for line in stdin:
        print(f'OK: {line.strip()}', flush=True)
    
[/code]

**実行**

[code]

    $ python3 --version
    Python 3.9.5
    $ python3 main.py
    OK: hoge
    OK: fuga
    OK: piyo
    
[/code]




pipe を `flush` するという方法もあるかと思います。

**main.py**

[code]

    import subprocess
    import sys
    
    with subprocess.Popen(
        [sys.executable, "sub.py"],
        stdin=subprocess.PIPE, stdout=subprocess.PIPE,
        encoding="utf-8",
    ) as p:
        for msg in ['hoge', 'fuga', 'piyo']:
            print(msg, file=p.stdin, flush=True)
            line = p.stdout.readline()
            print(line.strip())
    
[/code]

**sub.py**

[code]

    from sys import stderr, stdin, stdout
    
    for line in stdin:
        print(f'OK: {line.strip()}', flush=True)
    
[/code]

**実行**

[code]

    $ python3 --version
    Python 3.9.5
    $ python3 main.py
    OK: hoge
    OK: fuga
    OK: piyo
    
[/code]

