如何在config.ini文件中加载环境变量?

问题描述 投票:0回答:3

我有一个 config.ini 文件,其中包含一些属性,但我想读取配置文件中的环境变量。

[section1]
 prop1:(from envrinment variable) or value1

这可能吗?还是我必须编写一个方法来解决这个问题?

python configuration ini
3个回答
9
投票

我知道这对聚会来说已经晚了,但有人可能会发现这很方便。 您要求的是值插值os.environ相结合。

金字塔?

这样做的逻辑是不寻常的,通常如果一个人有一个金字塔服务器(由开箱即用的配置文件读取),同时想要模仿 django 服务器(总是设置为读取 os.environ ),就会发生这种情况).
如果您使用金字塔,则金字塔.paster.get_app具有参数选项:如果您将os.environ作为字典传递,则可以在ini中使用

%(variable)s
。并不是说这不是特定于
pyramid.paster.get_app
的,如下一节所示(但我的猜测是
get_app
就是这种情况)。

应用程序.py

from pyramid.paster import get_app
from waitress import serve
import os

app = get_app('production.ini', 'main', options=os.environ)
serve(app, host='0.0.0.0', port=8000, threads=50)

生产.ini:

[app:main]
sqlalchemy.url = %(SQL_URL)s
...

配置解析?

以上是使用configparser基本插值

假设我有一个名为

config.ini
的文件,其中包含以下行

[System]
conda_location = %(CONDA_PYTHON_EXE)

以下内容将起作用...

import configparser, os
cfg = configparser.ConfigParser()
cfg.read('config.ini')
print(cfg.get('System', 'conda_location', vars=os.environ))

0
投票

背景

我在使用

docker-compose
启动 API、PostgreSQL 数据库以及使用
alembic
运行迁移时遇到了类似的问题。 Alembic 从
alembic.ini
文件读取数据库连接,该文件具有:

sqlalchemy.url = postgresql://user:password@localhost:5432/db_name

docker-compose
中,我需要
localhost
部分来引用
db
容器的名称:
postgresql://user:password@db:5432/db_name

什么不起作用

我尝试在

environment
中设置
docker-compose
并尝试在
.ini
文件中设置值:
sqlalchemy.url = %(SQLALCHEMY_DATABASE_URL=postgresql://user:password@db:5432/db_name)
,但这不起作用。

有什么作用

最终 DID 最终工作的是更新

alembic
env.py
文件以从环境中读取并覆盖
.ini
文件中的配置值:

from logging.config import fileConfig
from os import environ as env
from alembic import context
...
config = context.config
if config.config_file_name is not None:
    fileConfig(config.config_file_name)
...
SQLALCHEMY_DATABASE_URL = env.get(
    "SQLALCHEMY_DATABASE_URL", "postgresql://user:password@localhost:5432/db_name"
)
config.set_main_option("sqlalchemy.url", SQLALCHEMY_DATABASE_URL)

这将从环境中读取值(如果存在)——如果不存在,则使用默认的本地主机值。稍后在文件中,根据覆盖的 env 值设置 url:

url = config.get_main_option("sqlalchemy.url")


-1
投票

我认为:thinking_face,使用.env并在config.py中

from dotenv import load_dotenv()
和下一行
load_dotenv()
中,它将从.env文件加载envs

© www.soinside.com 2019 - 2024. All rights reserved.