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

如何从Python父文件启动子文件并实时传输列表数据?

跨进程列表传输的常规实现方案

需求与问题

  • 父进程启动时自动拉起子进程,需将父进程中的列表数据实时传递给子进程
  • 父进程存在大量阻塞逻辑,子进程需持续输出数据,无法通过模块导入的方式实现
  • 已尝试subprocess.Popen实现双进程运行,但未解决数据传输问题;文件读写传输可靠性低、效率差

核心思路

进程间无法直接传递Python对象,需将列表序列化为可传输的字节流(如JSON格式),结合subprocess的管道实现父子进程的标准输入输出通信,避免文件IO的低效问题。

实现代码

父文件(parent.py)

import subprocess
import json

# 全局列表初始值
data_list = [0, 0, 0]

class CmdDecide:
    def __init__(self, param1=50):
        # 启动子进程,绑定标准输入管道
        self.child_process = subprocess.Popen(
            ["python3", "child.py"],
            stdin=subprocess.PIPE,
            text=True  # 以文本模式传输,无需手动编码字节
        )

    def func_A(self, var_from_someplace_else):
        global data_list
        data_list = var_from_someplace_else
        self.sendList(data_list)

    def sendList(self, target_list):
        # 将列表序列化为JSON字符串,添加换行符避免粘包
        json_data = json.dumps(target_list) + "\n"
        # 写入子进程标准输入,立即刷新缓冲区
        self.child_process.stdin.write(json_data)
        self.child_process.stdin.flush()

# 示例:模拟父进程的阻塞逻辑与数据更新
if __name__ == "__main__":
    cmd = CmdDecide()
    # 模拟外部数据更新
    import time
    time.sleep(2)  # 模拟阻塞操作
    cmd.func_A([1, 2, 3])
    time.sleep(3)
    cmd.func_A([4, 5, 6])
    # 等待子进程结束(按需保留)
    cmd.child_process.wait()

子文件(child.py)

import json
import sys

def main():
    current_list = [0, 0, 0]
    # 持续监听父进程输入
    while True:
        # 读取一行输入(父进程每次发送带换行的JSON)
        line = sys.stdin.readline()
        if line:
            # 解析JSON为列表
            try:
                current_list = json.loads(line.strip())
            except json.JSONDecodeError:
                # 解析失败则保留当前值
                pass
        # 持续输出当前列表(模拟业务逻辑)
        print(f"当前输出: {current_list}", flush=True)
        # 控制输出频率,避免占用过高资源
        import time
        time.sleep(0.5)

if __name__ == "__main__":
    main()

方案说明

  1. 序列化处理:利用json模块将Python列表转换为字符串,实现跨进程的对象传输,支持大部分基础数据类型
  2. 管道通信:通过subprocess.Popen的stdin管道,父进程直接向子进程写入数据,无需中间文件
  3. 粘包避免:每次发送数据时添加换行符,子进程按行读取,确保数据完整性
  4. 可靠性:管道通信是操作系统级别的IPC机制,比文件读写更高效、可靠

备选方案:multiprocessing队列

若允许父子进程在同一Python解释器环境下运行,可使用multiprocessing.Queue实现更便捷的对象传递:

  • 父进程创建队列,将队列作为参数传给子进程
  • 子进程持续监听队列,父进程向队列推送更新后的列表
  • 优点:无需手动序列化,直接传递Python对象;缺点:仅适用于同一解释器启动的子进程,无法跨独立脚本运行

内容的提问来源于stack exchange,提问作者user19323824

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:35:51