如何从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()
方案说明
- 序列化处理:利用
json模块将Python列表转换为字符串,实现跨进程的对象传输,支持大部分基础数据类型 - 管道通信:通过
subprocess.Popen的stdin管道,父进程直接向子进程写入数据,无需中间文件 - 粘包避免:每次发送数据时添加换行符,子进程按行读取,确保数据完整性
- 可靠性:管道通信是操作系统级别的IPC机制,比文件读写更高效、可靠
备选方案:multiprocessing队列
若允许父子进程在同一Python解释器环境下运行,可使用multiprocessing.Queue实现更便捷的对象传递:
- 父进程创建队列,将队列作为参数传给子进程
- 子进程持续监听队列,父进程向队列推送更新后的列表
- 优点:无需手动序列化,直接传递Python对象;缺点:仅适用于同一解释器启动的子进程,无法跨独立脚本运行
内容的提问来源于stack exchange,提问作者user19323824
相关产品推荐
相关产品推荐

