You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:32:32