如何通过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
相关产品推荐
相关产品推荐

