Python中Control进程如何从Generator进程内存获取数据(无磁盘存储)
嘿,我来帮你搞定这个进程间通信的问题!你想让Control.py直接获取Generator.py生成的数据,不用绕磁盘写文件,这完全可以实现,下面给你几个实用的方案:
方案一:通过标准输出(stdout)传递通用数据
这是最直接的方式——让Generator.py把数据序列化成通用格式(比如JSON)后打印到标准输出,Control.py通过subprocess捕获这个输出再反序列化。
修改后的Generator.py
import json def foo(): myList = [1,2,3] return myList # 将结果序列化为JSON字符串并打印到标准输出 print(json.dumps(foo()))
修改后的Control.py
import subprocess import json # 调用Generator.py,捕获标准输出 result = subprocess.run( ["python", "Generator.py"], capture_output=True, text=True, check=True # 如果Generator运行出错会抛出异常 ) # 反序列化输出得到原始数据 myList = json.loads(result.stdout.strip()) print("从Generator获取的数据:", myList)
为啥选JSON?因为它跨语言通用、格式清晰,就算是其他语言的进程也能解析,安全性也有保障。
方案二:用Pickle序列化Python特有对象
如果你的数据包含Python专属的对象(比如自定义类实例、datetime对象),JSON没法直接序列化,这时候可以用Python自带的pickle模块——但要注意:Pickle只能在Python进程间使用,且绝对不要反序列化不可信来源的数据,存在安全风险。
修改后的Generator.py
import pickle import sys def foo(): myList = [1,2,3] return myList # 序列化后写入标准输出(用二进制模式) pickle.dump(foo(), sys.stdout.buffer)
修改后的Control.py
import subprocess import pickle result = subprocess.run( ["python", "Generator.py"], capture_output=True, check=True ) # 从二进制输出反序列化得到数据 myList = pickle.loads(result.stdout) print("从Generator获取的数据:", myList)
方案三:实时流式数据传输
如果Generator.py是持续生成数据(比如循环输出),而非一次性返回结果,那可以用subprocess.Popen来实时读取输出:
修改后的Generator.py
import json import time def generate_data(): # 模拟持续生成数据 for i in range(5): yield [i, i+1, i+2] time.sleep(1) for data in generate_data(): print(json.dumps(data), flush=True) # flush=True确保立即输出,不缓存
修改后的Control.py
import subprocess import json # 启动进程并实时读取输出 process = subprocess.Popen( ["python", "Generator.py"], stdout=subprocess.PIPE, text=True, bufsize=1 # 启用行缓冲,实时读取每一行输出 ) # 逐行处理流式数据 for line in process.stdout: data = json.loads(line.strip()) print("实时收到数据:", data) # 等待进程结束 process.wait()
这个方案适合需要持续获取数据的场景,比如日志监控、实时计算结果传输。
内容的提问来源于stack exchange,提问作者Amit Sharma
相关产品推荐
相关产品推荐

