python - 子进程 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 环境变量?
解决方案
每个subprocess.run
都有自己的(新)外壳。在您的原始代码中:
subprocess.run
打开一个sh
外壳(默认为subprocess
)。sh
打开一个bash
外壳并设置变量(在bash
外壳内)。bash
和shellsh
都已关闭(因为您的第一个subprocess.run
命令已完成)和新设置的 env。变量被破坏。echo $A
在一个新的sh
shell 中启动,它不知道以前的 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 上共享,请将它们设置为~/.profile
or /etc/profile
。
推荐阅读
- c# - 在豁免“Unity.Exceptions.InvalidRegistrationException”中挣扎
- json - LWP 响应 JSON 值为空
- python - Python连接文本中的组合关键字
- azure - Nginx 路由忽略路径规则之后的任何内容
- database - 是否可以将用户踢出位于共享文件夹中的独立 Access 数据库?
- python - 传递空列表时使用 statistics.mean() 返回 NaN
- android - Volley:从具有 id 的服务器获取数据,然后将其显示在回收站视图中
- arrays - 谷歌表格导入范围+查询组合第一行
- amazon-web-services - 如何从 NGINX 的请求标头中删除 X-Frame-Options SAMEORIGIN 标头?
- javascript - RxJS - 初始状态和更新