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

如何通过Python os.system/subprocess获取所执行脚本内的变量值

核心结论

os.system() 本身只能拿到shell脚本的退出状态码,根本没法直接读到脚本内部的局部变量。本质上调用脚本时会启动一个独立的子shell进程,进程里的局部变量、运行状态在进程退出后就直接销毁,默认不会回传给父级的Python进程,不管是os.system还是直接调用subprocess都不可能凭空拿到这个值。
不要尝试用进程调试、读内存这类黑科技拿值,稳定性极差纯给自己找罪受,最省事、最稳定的方案就是改一小段shell脚本的逻辑,把你要的变量值主动输出出来,Python侧捕获输出即可。

具体实现步骤
  • 先修改script.sh:找到目标局部变量完成赋值的位置,在脚本核心逻辑跑完之后,单独加一行echo把这个值打印到标准输出。注意这行前后别混其他无关的打印内容,不然Python侧解析容易拿错值;如果要取多个变量,用特殊分隔符(比如###)拼接后打印即可。
  • Python侧替换原来的os.system()调用,改用subprocess.run()开启输出捕获,执行完成后直接解析拿到的目标值就能正常使用。
代码示例

shell脚本侧修改示例

假设你要获取的局部变量名为calc_result,在脚本原有逻辑最后加打印即可:

#!/bin/bash
# 以下是你原有的参数解析、业务逻辑代码,保持不变
# ... 原有逻辑执行完成后,calc_result已经被赋值
calc_result="你需要获取的局部变量值"

# 新增下面这行,单独输出目标值
echo "$calc_result"

Python侧实现代码

直接替换你原来的os.system调用即可,这里用参数列表传参比原来的字符串拼接更安全,自动处理带空格、特殊字符的参数,不会出现引号转义错误,也能避免命令注入问题:

import subprocess

# 构造命令参数列表
cmd = [
    "./script.sh",
    "--input1", inputValue1,
    "--input2", inputValue2,
    "--output-file", pathToOutputFile
]

# 执行脚本并捕获输出
exec_result = subprocess.run(
    cmd,
    capture_output=True,
    text=True,
    check=True  # 脚本执行失败(退出码非0)时直接抛异常,避免静默拿错值
)

# 解析拿到目标变量值,strip去掉首尾的换行、空白字符
target_value = exec_result.stdout.strip()

# 后续直接使用target_value即可
不污染原有脚本输出的替代方案

如果你的脚本本身已经要输出大量业务日志,不想把目标变量值混在日志里,可以选这个方案:

  • 给脚本新增一个可选参数,比如--result-file <临时文件路径>,Python调用脚本时先创建一个临时文件,把路径通过这个参数传给脚本;脚本执行完逻辑后,把目标变量值写入这个指定路径的文件,Python侧等脚本执行完成后直接读取文件内容即可,读完删掉临时文件,完全不影响脚本原有输出逻辑。

避坑提醒:别图省事用source script.sh的方式把脚本放到当前shell环境执行来拿变量,这种写法会让脚本里的目录切换、全局变量修改之类的逻辑直接改动Python进程的运行环境,很容易引发排查难度极高的环境异常问题。

内容的提问来源于stack exchange,提问作者skk6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:33:18