Skip to content

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

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

Возникла задача: написать консольную программу на Python, которая:

  • принимает аргументы командной строки;
  • умеет брать значения из переменных окружения;
  • умеет читать .env;
  • даёт значения по умолчанию.

Рабочий сниппет использует пакеты click и environs.

Логика переопределения значений

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

Это стандартное поведение для CLI‑приложений и сервисов.

Сниппет на Python

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. Запуск без параметров

Если нет ни глобальных переменных, ни .env, ни CLI‑аргументов — используются значения по умолчанию (например, сервис https://google.com, пустые логин/пароль).

2. Переменные в .env или глобальном окружении

Файл .env рядом с программой:

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

При запуске без аргументов возьмутся эти значения. То же самое, если переменные заданы в глобальном окружении.

3. Запуск с параметрами

CLI‑аргументы (--service/--user/--pass) перекрывают всё остальное — и .env, и глобальное окружение, и дефолты.