问题 从环境文件中读取环境变量


我想在本地环境中运行Python脚本,该脚本通常在Docker容器中运行。该 docker-compose.yml 指定一个 env_file 看起来(部分)如下:

DB_ADDR=rethinkdb
DB_PORT=28015
DB_NAME=ipercron

为了在本地运行,我将这些行转换为

os.environ['DB_ADDR'] = 'rethinkdb'
os.environ['DB_PORT'] = '28015'
os.environ['DB_NAME'] = 'ipercron'

我可以编写我的解析器,但我想知道是否有任何现有的模块/工具可以从配置文件中读取环境变量?


8069
2017-10-24 10:36


起源



答案:


看看吧 蟒蛇,dotenv


10
2017-10-24 10:44



注意:pip包名为python-dotenv,而不是dotenv。 (不幸的是,还有一个名为dotenv的完全不相关的包。) - Luke
不要使用它,它会大量打破新行,将两个变量合二为一,等等。阅读没问题,但'dotenv set'根本不起作用。 - sortas


答案:


看看吧 蟒蛇,dotenv


10
2017-10-24 10:44



注意:pip包名为python-dotenv,而不是dotenv。 (不幸的是,还有一个名为dotenv的完全不相关的包。) - Luke
不要使用它,它会大量打破新行,将两个变量合二为一,等等。阅读没问题,但'dotenv set'根本不起作用。 - sortas


您可以使用 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

5
2017-10-24 10:44





仅使用python标准

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)

0
2018-05-21 21:37





这也适合你:

env_vars = []
with open(env_file) as f:
    for line in f:
        if line.startswith('#'):
            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);

在评论中你会发现一些不同的方法来保存环境变量,还有一些解析选项,即摆脱领先 export 关键词。另一种方法是使用 蟒蛇,dotenv 图书馆。干杯。


0
2017-08-17 23:48