/
monoceros
/
hilink-api
Обзор
Документация
Войти
/
monoceros
/
hilink-api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
python/env_loader.py
86 строк
3 KB
Алексей Сопов
first_commit
12 янв 2026, 18:17
12 янв 2026, 18:17
845f41c
Код
Авторство
О чём код?
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Загрузка переменных из .env для CLI-скриптов. Важно: Python сам по себе НЕ читает .env. Поэтому мы пробуем подхватить: - `.env` из текущей рабочей директории (где запускают скрипт) - `.env` рядом со скриптом (на случай запуска из другой папки) Если `python-dotenv` не установлен — используем простой встроенный парсер `.env`. """ from __future__ import annotations import os from pathlib import Path def _parse_dotenv_file(path: Path) -> dict[str, str]: """ Минимальный парсер .env (KEY=VALUE). - Игнорирует пустые строки и комментарии (# ...) - Обрезает пробелы вокруг ключа/значения - Снимает внешние кавычки '...' / "..." (если есть) """ out: dict[str, str] = {} try: text = path.read_text(encoding="utf-8") except Exception: # Windows: иногда .env в ANSI/cp1251 try: text = path.read_text(encoding="cp1251") except Exception: return out for raw in text.splitlines(): line = raw.strip() if not line or line.startswith("#"): continue if "=" not in line: continue key, value = line.split("=", 1) key = key.strip() value = value.strip() if not key: continue if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")): value = value[1:-1] out[key] = value return out def _apply_env(env: dict[str, str]) -> None: # Не перезатираем уже заданные переменные окружения for k, v in env.items(): os.environ.setdefault(k, v) def load_env() -> None: """Пытается загрузить .env, не перезатирая уже заданные переменные окружения.""" try: from dotenv import find_dotenv, load_dotenv # type: ignore except Exception: # Фолбек без зависимостей: читаем .env вручную. candidates = [ Path.cwd() / ".env", Path(__file__).resolve().parent / ".env", ] for p in candidates: if p.exists(): _apply_env(_parse_dotenv_file(p)) return return # 1) Сначала ищем от cwd (это то, что ожидают в PowerShell). env_path = find_dotenv(filename=".env", usecwd=True) # type: ignore[call-arg] if env_path: load_dotenv(env_path, override=False) return # 2) Фолбек: .env рядом с этим файлом (т.е. рядом со скриптами репо). here = Path(__file__).resolve().parent candidate = here / ".env" if candidate.exists(): load_dotenv(str(candidate), override=False)