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)
请给出一些建议
有一个很棒的 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)
您不需要使用子进程.
读取行和拆分环境变量名称,值并将其分配给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)