使用python按文件设置环境变量

use*_*092 3 python linux shell

我有一个文件包含一组环境变量.

env_script.env:

export a=hjk
export b=jkjk
export c=kjjhh
export i=jkkl
..........
Run Code Online (Sandbox Code Playgroud)

我想通过从文件中读取来设置这些环境变量.我怎么能在python中做到这一点

试过示例代码:

pipe = subprocess.Popen([".%s;env", "/home/user/env_script.env"], stdout=subprocess.PIPE, shell=True)
output = pipe.communicate()[0]
env = dict((line.split("=", 1) for line in output.splitlines()))
os.environ.update(env)
Run Code Online (Sandbox Code Playgroud)

请给出一些建议

jua*_*ngo 9

有一个很棒的 python 库python-dotenv,它允许您将变量从.env文件或您想要的任何文件导出到您的环境,您可以将其置于源代码控制之外(即添加到.gitignore):

# to install
pip install -U python-dotenv
Run Code Online (Sandbox Code Playgroud)
# your .env file
export MY_VAR_A=super-secret-value
export MY_VAR_B=other-very-secret-value
...
Run Code Online (Sandbox Code Playgroud)

当你开始时,你只需在 python 中加载它:

# settings.py
from dotenv import load_dotenv
load_dotenv()
Run Code Online (Sandbox Code Playgroud)

然后,您可以稍后在代码中访问任何变量:

from os import environ

my_value_a = environ.get('MY_VALUE_A')
print(my_value_a) # 'super-secret-value'
Run Code Online (Sandbox Code Playgroud)


fal*_*tru 6

您不需要使用子进程.

读取行和拆分环境变量名称,值并将其分配给os.environ:

import os

with open('/home/user/env_script.env') as f:
    for line in f:
        if 'export' not in line:
            continue
        if line.startswith('#'):
            continue
        # Remove leading `export `
        # then, split name / value pair
        key, value = line.replace('export ', '', 1).strip().split('=', 1)
        os.environ[key] = value
Run Code Online (Sandbox Code Playgroud)

或使用dict.update生成器表达式:

with open('env_script.env') as f:
    os.environ.update(
        line.replace('export ', '', 1).strip().split('=', 1) for line in f
        if 'export' in line
    )
Run Code Online (Sandbox Code Playgroud)

或者,你可以做一个包装shell脚本,其中sourceS中env_script.env,然后执行原来的Python文件.

#!/bin/bash
source /home/user/env_script.env
python /path/to/original_script.py
Run Code Online (Sandbox Code Playgroud)