Python与Python/Shell脚本间变量传递的最便捷方法问询
Python与Shell/Python子脚本间双向变量传递最优方案
一、Python ↔ Python子脚本(sub1.py)
首选方案:导入+命名空间注入
对应你提到的方式2,这是最接近原Shell source 体验、效率最高的方案:
- 关于sub1.py中非函数/类的全局代码执行问题:导入时会自动执行全局代码。如果不想让全局逻辑在导入时触发,建议把sub1的核心逻辑封装成函数或类,导入后手动调用。
- 双向传递实现:
- main.py → sub1.py:导入后直接将变量注入sub1的命名空间
import sub1 # 传递变量到sub1 sub1.shared_var = "from main" # 调用sub1的封装函数 sub1.process_data() - sub1.py → main.py:直接读取sub1的全局变量,或通过函数返回结果
# 读取sub1的全局变量 received_val = sub1.result_var # 或接收函数返回值 received_val = sub1.get_result()
- main.py → sub1.py:导入后直接将变量注入sub1的命名空间
- 优势:内存内直接交互,无额外IO开销,实现简单,完全模拟Shell共享变量的逻辑。
备选方案:Pickle文件传递(独立进程场景)
如果子脚本必须作为独立进程运行(不能导入),用Pickle序列化是Python间最便捷的跨进程传递方式:
- main.py写入变量:
import pickle import subprocess vars_to_pass = {"var1": 123, "var2": "abc"} with open("var_dump.pkl", "wb") as f: pickle.dump(vars_to_pass, f) # 启动sub1.py进程 subprocess.Popen(["python", "sub1.py"]) - sub1.py读取变量并写入结果:
import pickle with open("var_dump.pkl", "rb") as f: received_vars = pickle.load(f) # 处理逻辑 result = {"status": "done", "data": 456} with open("result_dump.pkl", "wb") as f: pickle.dump(result, f) - main.py读取结果:同sub1的读取逻辑,加载
result_dump.pkl即可。
二、Python ↔ Shell脚本(sub2.sh)
首选方案:环境变量+标准输出捕获
结合环境变量传递到Shell,再通过捕获Shell的标准输出实现反向传递,最贴合原Shell source 的使用习惯:
- main.py → sub2.sh:通过
os.environ设置环境变量,子进程会继承当前环境
sub2.sh中直接使用环境变量:import os import subprocess # 设置环境变量 os.environ["VAR_FROM_PYTHON"] = "hello shell" # 启动sub2.sh并捕获输出 proc = subprocess.Popen(["./sub2.sh"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = proc.communicate()echo "Received from Python: $VAR_FROM_PYTHON" - sub2.sh → main.py:Shell脚本将结果通过标准输出打印(建议用
KEY=VALUE格式),main.py解析输出
sub2.sh输出结果:
main.py解析:# 输出要传递的变量 echo "RESULT=success" echo "DATA=789"result_dict = {} for line in stdout.splitlines(): line = line.strip() if "=" in line: key, val = line.split("=", 1) result_dict[key] = val # 获取结果 status = result_dict.get("RESULT") data = result_dict.get("DATA") - 优势:无需额外文件,符合Shell脚本的常规用法,双向传递逻辑清晰。
备选方案:文本文件传递(复杂变量场景)
如果需要传递多组变量或复杂结构,可通过文本文件实现:
- main.py写入变量到文本:
with open("vars.sh", "w") as f: f.write('VAR1="value1"\n') f.write('VAR2=12345\n') - sub2.sh读取:直接
source加载为Shell变量source vars.sh echo "VAR1 is $VAR1" - sub2.sh写入结果:
echo "FINAL_RESULT=completed" > result.txt - main.py读取结果:
with open("result.txt") as f: line = f.read().strip() final_result = line.split("=", 1)[1]
总结
- Python ↔ Python:优先使用导入+命名空间注入,仅当子脚本必须独立运行时用Pickle文件。
- Python ↔ Shell:优先使用环境变量+标准输出捕获,复杂变量场景用文本文件传递。
内容的提问来源于stack exchange,提问作者silence_of_the_lambdas
相关产品推荐
相关产品推荐

