如何从Python调用Shell脚本并获取其导出的环境变量?
解决Python调用Bash脚本后获取环境变量的问题
因为Bash脚本作为Python启动的子进程,其导出的环境变量仅存在于子进程生命周期中,无法直接传递到父进程(Python)。以下是几种可行的解决方法:
方法一:通过Bash输出全部环境变量,Python解析后导入
利用source执行脚本后,通过env命令输出当前环境的所有变量,再让Python捕获输出并解析到自身的环境变量中。
示例Python代码:
import subprocess import os # 执行脚本并获取环境变量列表 env_output = subprocess.check_output( ["bash", "-c", "source myscript.sh && env"], text=True ) # 解析每一行的环境变量,注入到Python进程的环境中 for line in env_output.splitlines(): if "=" in line: key, val = line.split("=", 1) os.environ[key] = val # 测试是否获取到目标变量 print(os.environ.get("TARGET_VAR"))
方法二:修改Bash脚本,仅输出需要的环境变量
如果不需要全部环境变量,可以修改myscript.sh,在末尾专门输出你需要的变量(避免解析大量无关内容):
修改后的myscript.sh末尾:
# 原脚本的导出命令 export TARGET_VAR="some_value" # 添加输出命令,格式为 KEY=VALUE echo "TARGET_VAR=$TARGET_VAR"
对应的Python代码:
import subprocess import os # 调用脚本并捕获输出 script_output = subprocess.check_output(["./myscript.sh"], text=True) # 提取目标变量 for line in script_output.splitlines(): if line.startswith("TARGET_VAR="): key, val = line.split("=", 1) os.environ[key] = val print(os.environ["TARGET_VAR"])
方法三:直接获取单个目标变量的值
如果已经明确知道要获取的变量名,可以直接让Bash执行脚本后输出该变量的值,再在Python中直接设置:
import subprocess import os # 执行脚本后直接输出目标变量的值 var_value = subprocess.check_output( ["bash", "-c", "source myscript.sh && echo $TARGET_VAR"], text=True ).strip() # 将变量注入Python环境 os.environ["TARGET_VAR"] = var_value
内容的提问来源于stack exchange,提问作者texmelex
相关产品推荐
相关产品推荐

