Аргументы из cli. Python

А также из переменных окружения

Опубликовал Максим Баев, 11 апреля 2019, 10:47

Вот например появилась необходимость создать консольную программку на Python, которая должна принимать аргументы и чтобы всё было гибко, и что-нибудь ещё. Вот рабочий сниппет с использованием пакетов click и environs.

python-snippet

Возможности переопределения

  1. Если переменная нигде не объявлена (является необязательной по сценарию и имеет значение по умолчанию), то возьмётся значение по умолчанию.
  2. Значение может лежать в переменной глобального окружения на машине/сервере
  3. Переменная окружения может лежать в файле .env рядом с программой и переопределять такую же переменную из глобального окружения (если она есть)
  4. Она может быть указана в параметрах/аргументах запуска программы и переопределять всё выше сказанное

Запутанно? Может быть, но это довольно стандартное поведение для приложений работающих, как сервис. Сниппет на 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. Запуск без параметров

python-snippet

Пункт 3. Переменные в окружении

Рядом можно положить файл .env и прописать в него переменные:

MYAPP_SERVICE=http://localhost
MYAPP_USER=Still Max
MYAPP_PASS=Super secret Password

python-snippet Если переменные будут находиться в глобальном окружении, результат будет таким же.

Пункт 4. Запуск с параметрами

python-snippet

Другие посты