Вот например появилась необходимость создать консольную программку на Python, которая должна принимать аргументы и чтобы всё было гибко, и что-нибудь ещё. Вот рабочий сниппет с использованием пакетов click и environs.
Возможности переопределения
- Если переменная нигде не объявлена (является необязательной по сценарию и имеет значение по умолчанию), то возьмётся значение по умолчанию.
- Значение может лежать в переменной глобального окружения на машине/сервере
- Переменная окружения может лежать в файле
.env
рядом с программой и переопределять такую же переменную из глобального окружения (если она есть) - Она может быть указана в параметрах/аргументах запуска программы и переопределять всё выше сказанное
Запутанно? Может быть, но это довольно стандартное поведение для приложений работающих, как сервис. Сниппет на python:
#!/usr/bin/env python3
import click
from environs import Env
env = Env()
# Чтение переменных окружения из файла .env, если он существует.
env.read_env()
# Переменные среды будут читаться с этим префиксом.
# Т.е. MYAPP_SERVICE, MYAPP_USER и MYAPP_PASS
with env.prefixed("MYAPP_"):
default = {
'service': env('SERVICE', 'https://google.com'),
'user': env('USER', None),
'pass': env('PASS', None),
}
@click.command()
@click.option(
'--service', '-s',
help='Address of the Service.',
prompt='Please enter address of Service',
default=env('SERVICE', default['service'])
)
@click.option(
'--user', '-u',
help='Your username of service "%s".' % default['service'],
required=True,
prompt='Please enter Username',
default=default['user']
)
@click.option(
'--pass', '-p', 'password',
help='Your password of service "%s".' % default['service'],
required=True,
hide_input=True,
confirmation_prompt=True,
prompt='Please enter Password',
default=default['pass']
)
def run_my_app(service, user, password):
click.echo({
'service': service,
'user': user,
'password': password
})
if __name__ == '__main__':
run_my_app()
Результат
Пункт 1. Запуск без параметров
Пункт 3. Переменные в окружении
Рядом можно положить файл .env
и прописать в него переменные:
MYAPP_SERVICE=http://localhost
MYAPP_USER=Still Max
MYAPP_PASS=Super secret Password
Если переменные будут находиться в глобальном окружении, результат будет таким же.