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

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()
      
  • 优势:内存内直接交互,无额外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设置环境变量,子进程会继承当前环境
    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()
    
    sub2.sh中直接使用环境变量:
    echo "Received from Python: $VAR_FROM_PYTHON"
    
  • sub2.sh → main.py:Shell脚本将结果通过标准输出打印(建议用KEY=VALUE格式),main.py解析输出
    sub2.sh输出结果:
    # 输出要传递的变量
    echo "RESULT=success"
    echo "DATA=789"
    
    main.py解析:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:53:25