首页 > 解决方案 > 子进程 bash 脚本不会全局修改环境变量

问题描述

我有一个 bash 脚本,它分配了几个环境变量。作为一个更简单的例子,我们可能有类似的东西

export A=a

此脚本称为exporter.sh.

我正在尝试使用subprocess.run. 以下 python 脚本运行导出器脚本并检查环境变量是否已正确设置:

import subprocess

subprocess.run("bash exporter.sh", shell=True)

print(subprocess.run(
    "echo $A",
    stdout=subprocess.PIPE,
    shell=True,
).stdout.decode('utf-8'))

但是,这不会返回任何内容。如何在 python 中全局设置 bash 环境变量?

标签: pythonbashsubprocess

解决方案


每个subprocess.run都有自己的(新)外壳。在您的原始代码中:

  1. subprocess.run打开一个sh外壳(默认为subprocess)。
  2. sh打开一个bash外壳并设置变量(在bash外壳内)。
  3. bash和shellsh都已关闭(因为您的第一个subprocess.run命令已完成)和新设置的 env。变量被破坏。
  4. echo $A在一个新的shshell 中启动,它不知道以前的 shell 有变量。

您可以在同一个 bash shell 中同时运行“setter”和“getter”。

出口商.sh

export A=b_set_from_exporter.sh

蟒蛇脚本

import subprocess
cmd = "bash -c 'source ./exporter.sh && echo $A'"
print(subprocess.run(
    cmd,
    stdout=subprocess.PIPE,
    shell=True
).stdout.decode('utf-8'))

b_set_from_exporter.sh

笔记:

如果您确实需要设置全局变量并且可访问(并且永远)以在多个 bash shell 上共享,请将它们设置为~/.profileor /etc/profile


推荐阅读