【问题标题】:subprocess bash script doesn't modify environment variables globally子进程 bash 脚本不会全局修改环境变量
【发布时间】:2020-11-24 15:39:14
【问题描述】:

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

export A=a

这个脚本叫做exporter.sh

我正在尝试使用 subprocess.run 从 python 运行此脚本。以下 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 环境变量?

【问题讨论】:

  • 是否需要bash脚本来设置环境变量?你能直接从你的 Python 代码中设置这些环境变量吗?
  • 是的,这将是我的主要要求,我正在重新使用我的代码库中的 bash 脚本

标签: python bash subprocess


【解决方案1】:

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

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

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

exporter.sh

export A=b_set_from_exporter.sh

python 脚本

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 上共享,请将它们设置为 ~/.profile/etc/profile

【讨论】:

  • 不幸的是,这不允许从 python 访问在调用的 bash 脚本中设置的环境变量。这只是允许将环境变量暴露给被调用的 bash 脚本。
  • 有没有没有自己shell限制的函数?
  • @David Masip:已编辑。
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 2012-09-03
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多