我想在本地环境中运行Python脚本,该脚本通常在Docker容器中运行.在docker-compose.yml
指定了一个env_file看上去(部分)如下所示:
DB_ADDR=rethinkdb
DB_PORT=28015
DB_NAME=ipercron
Run Code Online (Sandbox Code Playgroud)
为了在本地运行,我将这些行转换为
os.environ['DB_ADDR'] = 'rethinkdb'
os.environ['DB_PORT'] = '28015'
os.environ['DB_NAME'] = 'ipercron'
Run Code Online (Sandbox Code Playgroud)
我可以编写我的解析器,但我想知道是否有任何现有的模块/工具可以从配置文件中读取环境变量?
Par*_*ser 99
我使用Python Dotenv 库。只需安装库pip install python-dotenv
,.env
使用您的环境变量创建一个文件,然后在您的代码中导入环境变量,如下所示:
import os
from dotenv import load_dotenv
load_dotenv()
MY_ENV_VAR = os.getenv('MY_ENV_VAR')
Run Code Online (Sandbox Code Playgroud)
从.env
文件:
MY_ENV_VAR="This is my env var content."
Run Code Online (Sandbox Code Playgroud)
当我需要在我的 docker 系统之外测试代码并准备将它再次返回到 docker 时,我就是这样做的。
tab*_*ble 24
rad*_*tek 12
这也适用于您:
env_vars = []
with open(env_file) as f:
for line in f:
if line.startswith('#') or not line.strip():
continue
# if 'export' not in line:
# continue
# Remove leading `export `, if you have those
# then, split name / value pair
# key, value = line.replace('export ', '', 1).strip().split('=', 1)
key, value = line.strip().split('=', 1)
# os.environ[key] = value # Load to local environ
env_vars.append({'name': key, 'value': value}) # Save to a list
print(env_vars);
Run Code Online (Sandbox Code Playgroud)
在评论中,您会发现几种不同的方法来保存环境变量以及一些解析选项,即摆脱前导export
关键字。另一种方法是使用python-dotenv库。干杯。
Mar*_*sad 10
Dewald Abrie 发布了一个很好的解决方案,这里有一个忽略隔断线的轻微修改 (\n)
def get_env_data_as_dict(path: str) -> dict:
with open(path, 'r') as f:
return dict(tuple(line.replace('\n', '').split('=')) for line
in f.readlines() if not line.startswith('#'))
print(get_env_data_as_dict('../db.env'))
Run Code Online (Sandbox Code Playgroud)
你可以用ConfigParser
.示例可以在这里找到.
但是这个库期望你的key
= value
数据存在于某些数据库之下[heading]
.例如,像:
[mysqld]
user = mysql # Key with values
pid-file = /var/run/mysqld/mysqld.pid
skip-external-locking
old_passwords = 1
skip-bdb # Key without value
skip-innodb
Run Code Online (Sandbox Code Playgroud)
如果您的系统/环境/工作流支持 POSIX shell 脚本,您可以创建一个包含这两个操作的脚本:
set -a
选项 where “创建或修改的每个变量或函数都被赋予导出属性并标记为导出到后续命令的环境”。os.environ.get
代码的Python 脚本/应用程序这是一个示例 .env 文件(config.env):
TYPE=prod
PORT=5000
Run Code Online (Sandbox Code Playgroud)
这是 Python 代码(test.py):
import os
print(os.environ.get('TYPE'))
print(os.environ.get('PORT'))
Run Code Online (Sandbox Code Playgroud)
这是一个示例 bash 脚本(run.sh):
#!/usr/local/bin/bash
set -a
source config.env
set +a
python3 test.py
Run Code Online (Sandbox Code Playgroud)
这是一个示例运行:
$ tree
.
??? config.env
??? run.sh
??? test.py
$ echo $TYPE
$ echo $PORT
$ python3 test.py
None
None
$ ./run.sh
prod
5000
Run Code Online (Sandbox Code Playgroud)
当您直接运行 Python 脚本 ( python3 test.py
) 时,它使用.environ.get
和不使用source
.env 文件,它都会打印出 .env 文件None
。
但是,当您将其包装在首先将 .env 文件加载到环境变量中,然后运行 Python 脚本(仍在使用.environ.get
)的 shell 脚本中时,Python 脚本现在应该能够读取环境变量了。
与其他流行的答案相比,这不需要任何外部 Python 库。
对于更紧凑的解决方案如何:
import os
with open('.docker-compose-env', 'r') as fh:
vars_dict = dict(
tuple(line.split('='))
for line in fh.readlines() if not line.startswith('#')
)
print(vars_dict)
os.environ.update(vars_dict)
Run Code Online (Sandbox Code Playgroud)
仅使用python std
import re
envre = re.compile(r'''^([^\s=]+)=(?:[\s"']*)(.+?)(?:[\s"']*)$''')
result = {}
with open('/etc/os-release') as ins:
for line in ins:
match = envre.match(line)
if match is not None:
result[match.group(1)] = match.group(2)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
36040 次 |
最近记录: |