В современном Python дела обстоят намного лучше.
Вот простая дочерняя программа "hello.py":
#!/usr/bin/env python3
while True:
i = input()
if i == "quit":
break
print(f"hello {i}")
И программа для взаимодействия с ним:
import asyncio
async def main():
proc = await asyncio.subprocess.create_subprocess_exec(
"./hello.py", stdin=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE
)
proc.stdin.write(b"bob\n")
print(await proc.stdout.read(1024))
proc.stdin.write(b"alice\n")
print(await proc.stdout.read(1024))
proc.stdin.write(b"quit\n")
await proc.wait()
asyncio.run(main())
Это распечатывает:
b'hello bob\n'
b'hello alice\n'
Обратите внимание, что фактический шаблон, который также содержится почти во всех предыдущих ответах, как здесь, так и в связанных вопросах, состоит в том, чтобы установить дескриптор файла stdout ребенка на неблокирование, а затем опрашивать его в каком-то цикле выбора. В эти дни, конечно, этот цикл предоставляется asyncio.