为了账号安全,请及时绑定邮箱和手机立即绑定

在不使用`source`的情况下加载python envvars

在不使用`source`的情况下加载python envvars

PIPIONE 2022-06-28 10:32:21
我正在寻找envvars.sh在 django 应用程序中加载文件的解决方案。我更愿意在设置模块中执行此操作,并在其外部保留一个文件。这是我目前拥有的: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] = valueif not os.environ.get('DB_HOST'): source_envvars()# rest of settings.py file...使用这种方法有什么缺点吗?我知道这不支持复杂的 bash 类型的导出,但我所拥有的只是以下形式的基本导出:export DB_HOST=rds.amazon.com/12345上述方法是否正确实例化了所有变量,或者它是否似乎遗漏了某些东西或以某种方式不安全?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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


因此,一种更强大的方法是使用to source和命令subprocess.check_output来运行 shell以输出环境变量,然后可以使用其输出来创建生成器表达式以进行更新:.envvars.shenvos.environ


os.environ.update(

    line.rstrip().split('=', 1)

    for line in subprocess.check_output(['sh', '-c', '. envvars.sh; env']).splitlines()

)


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信