gpt4 book ai didi

python - 不使用 `source` 加载 python 环境变量

转载 作者:行者123 更新时间:2023-12-01 07:05:44 25 4
gpt4 key购买 nike

我正在寻找在 django 应用程序中加载 envvars.sh 文件的解决方案。我更愿意在设置模块内执行此操作并在其外部保留一个文件。这是我目前拥有的:

SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

def source_envvars(fname='envvars.sh'):
"""Equivalent of `$ source {fname}` with lines in the form of `export key=value`"""
envvars = os.path.join(SITE_ROOT, fname)
if not os.path.exists(envvars): return
with open(fname, 'r') as f:
for line in f:
if line.startswith('export '):
line = line.strip()
key = line.split('=')[0].split()[1]
value = line.split('=')[1].strip('"\'')
os.environ[key] = value


if not os.environ.get('DB_HOST'): source_envvars()
# rest of settings.py file...

使用这种方法有什么缺点吗?我知道这不支持复杂的 bash 类型导出,但我所拥有的只是以下形式的基本导出:

export DB_HOST=rds.amazon.com/12345

上述方法是否正确实例化了所有变量,或者它似乎缺少某些内容或以某种方式不安全?

最佳答案

您的实现只能处理固定格式。 shell 脚本可能有条件语句和循环等,如果不通过 shell 实际获取它们,这些都无法正确处理。

因此,更稳健的方法是使用 subprocess.check_output使用 . 运行 shell来源envvars.shenv命令输出环境变量,然后可以使用其输出创建生成器表达式来更新 os.environ与:

os.environ.update(
line.rstrip().split('=', 1)
for line in subprocess.check_output(['sh', '-c', '. envvars.sh; env']).splitlines()
)

关于python - 不使用 `source` 加载 python 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58459660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com