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

2024-05-29 04:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找在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

上面的方法是否正确地实例化了所有的变量,或者在某种程度上似乎遗漏了什么或者不安全


Tags: 文件ofpathkeysourceifvalueos
1条回答
网友
1楼 · 发布于 2024-05-29 04:26:55

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

因此,更可靠的方法是使用subprocess.check_output运行shell,使用.生成envvars.sh,使用env命令输出环境变量,然后可以使用该命令的输出创建生成器表达式来更新os.environ

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

相关问题 更多 >

    热门问题