如何将prep.py内的Python对象传递给子进程slave.py的全局作用域
有可直接落地的实现方案,你当前用os.system启动的是独立子进程,父子进程内存空间完全隔离,无法直接传递内存中的Python对象,调整prep.py的调用逻辑即可满足需求。
最优方案:用runpy模块执行slave脚本直接注入全局变量
这个方案不需要修改slave.py的原有逻辑,传递的对象可以直接在slave的全局作用域访问。
修改后的prep.py代码如下(你原代码漏了导入os,同步补上):
import sys import runpy import os # 此处定义所有你需要传递到slave的变量/对象 prep_env = {"db_host": "192.168.1.10", "db_port": 3306} custom_obj = {"user_info": {"id": 1, "name": "test"}} if __name__ == "__main__": # 你原执行命令是python prep.py python slave.py,slave路径对应sys.argv[2] slave_path = sys.argv[2] # 执行slave脚本,init_globals参数就是注入的全局变量 runpy.run_path( slave_path, init_globals={ "prep_env": prep_env, "custom_obj": custom_obj }, run_name="__main__" )
执行命令可以进一步简化为python prep.py slave.py,对应把prep.py里的slave_path取值改成sys.argv[1]即可。
完成修改后,你在slave.py中可以直接访问注入的全局变量,无需额外导包:
# slave.py 内直接使用即可 print(prep_env["db_host"]) print(custom_obj["user_info"]["name"])
其他可选方案
如果必须保留子进程启动的方式,可以选择序列化传递:
- 简单字符串类型可以直接存入环境变量:prep.py中通过
os.environ["CUSTOM_VAR"] = "xxx"写入,slave.py中通过os.environ.get("CUSTOM_VAR")读取 - 复杂Python对象可以用
pickle序列化后存入临时文件/管道,slave.py中再反序列化读取,这种方式需要额外处理序列化兼容问题,效率低于第一种方案。
内容的提问来源于stack exchange,提问作者valter
相关产品推荐
相关产品推荐

