如何在Python中与子进程共享标准输入?
Python实现父子进程共享标准输入的方案
要实现你给出的C++程序的功能,Python里有两种直接的实现方式,分别对应不同的使用场景:
方法一:使用os.fork(与C++逻辑完全对齐)
这种方式和C++的fork逻辑完全一致,子进程会自动继承父进程的所有文件描述符(包括标准输入),无需额外配置。
import os import sys def main(): # 父进程先读取标准输入 buffer = sys.stdin.read(256) # 与C++的read(0, buffer, 256)行为一致 print(f"(1) Parent received: {buffer}", end='') pid = os.fork() if pid < 0: print("fork failed", file=sys.stderr) sys.exit(1) elif pid == 0: # 子进程读取同一标准输入 buffer = sys.stdin.read(256) print(f"(2) Child received: {buffer}", end='') sys.exit(0) else: # 父进程等待子进程执行完毕 os.wait() print("done with child") # 父进程继续读取标准输入 buffer = sys.stdin.read(256) print(f"(3) Parent received: {buffer}", end='') if __name__ == "__main__": main()
说明
- 用
sys.stdin.read(256)完全对应C++中固定长度读取的逻辑,也可以根据需求换成readline()按行读取。 - 子进程继承父进程的stdin文件描述符,因此读取的是同一个输入流,和C++程序的行为完全一致。
方法二:使用subprocess.Popen
如果需要调用外部脚本或程序作为子进程,可通过subprocess.Popen的stdin=subprocess.INHERIT参数让子进程继承父进程的标准输入。
步骤1:编写子进程脚本(child.py)
import sys # 子进程读取标准输入并输出 buffer = sys.stdin.read(256) print(f"(2) Child received: {buffer}", end='')
步骤2:父进程代码
import subprocess import sys def main(): # 父进程先读取标准输入 buffer = sys.stdin.read(256) print(f"(1) Parent received: {buffer}", end='') # 创建子进程,指定继承父进程的stdin proc = subprocess.Popen([sys.executable, "child.py"], stdin=subprocess.INHERIT) proc.wait() # 等待子进程结束 print("done with child") # 父进程继续读取标准输入 buffer = sys.stdin.read(256) print(f"(3) Parent received: {buffer}", end='') if __name__ == "__main__": main()
说明
subprocess.INHERIT明确告诉子进程复用父进程的标准输入流,这是实现共享的关键参数。- 这种方式更适合集成外部独立程序的场景,而非同一代码内的进程分支。
内容的提问来源于stack exchange,提问作者Jennifer M.
相关产品推荐
相关产品推荐

