""" Вывод результатов: консоль + файл. Прозрачная замена print() — всё что идёт в out(), дублируется в лог-файл. """ import sys from pathlib import Path from datetime import datetime from typing import Any class Output: """Дуплексный вывод: консоль + лог-файл.""" def __init__(self, log_dir: str | None = None): if log_dir is None: log_dir = Path(__file__).parent.parent / "logs" Path(log_dir).mkdir(parents=True, exist_ok=True) self._log_path = Path(log_dir) / f"scan_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" self._file = open(self._log_path, "w", encoding="utf-8") def __call__(self, *args, **kwargs): """out('текст') — вывести на консоль и в лог.""" sep = kwargs.get("sep", " ") end = kwargs.get("end", "\n") text = sep.join(str(a) for a in args) + end # Консоль sys.stdout.write(text) sys.stdout.flush() # Файл (без emoji для читаемости) clean = text.encode("ascii", errors="replace").decode("ascii") self._file.write(clean) self._file.flush() def close(self): self._file.close() @property def log_path(self) -> Path: return self._log_path # Глобальный экземпляр out = Output()