"""Einstiegspunkt der gebuendelten RippySetup.exe. Bewusst winzig: PyInstaller braucht EINE Datei als Startpunkt, und alles Weitere gehoert ins Paket `rippy`, wo es getestet werden kann. Was hier steht, laesst sich nicht testen — also steht hier so wenig wie moeglich. ## Warum hier trotzdem etwas zur Ausgabe steht Die EXE ist als Fenster-Programm gebaut (`--windowed`), damit beim Start KEINE Konsole aufgeht — ausdruecklicher Wunsch des Commanders am 28.08.2026: „Unterbinde das CMD Fenster was sich beim Oeffnen mitoeffnet." Der Preis: `sys.stdout` ist dann `None`. Jede Bibliothek, die auf `stderr` schreibt — uvicorn tut das —, wuerde mit `AttributeError: 'NoneType' object has no attribute 'write'` sterben, und zwar mitten im Start, ohne dass irgendwo etwas stuende. Deshalb ganz zu Anfang, VOR allen anderen Importen aus `rippy`: 1. In einem Terminal gestartet? -> dort hineinschreiben 2. Sonst -> in %LOCALAPPDATA%\\Rippy\\rippy.log """ import multiprocessing import sys def _ausgabe_richten() -> None: """Dafuer sorgen, dass es eine Ausgabe GIBT — Konsole oder Datei.""" from rippy.platform import winlauf if not winlauf.ohne_konsole(): return # aus dem Quellcode gestartet if winlauf.an_elternkonsole_haengen(): # Ein Terminal ist da. Die Stroeme neu oeffnen, sonst bleibt # sys.stdout trotz Konsole None. try: sys.stdout = open("CONOUT$", "w", encoding="utf-8", errors="replace", buffering=1) sys.stderr = sys.stdout return except OSError: pass winlauf.ausgabe_umleiten() def main() -> int: # Pflicht in gebuendelten Programmen: Ohne diesen Aufruf startet ein # Kindprozess unter Windows die ganze EXE erneut — eine Startschleife, # die sich als "das Programm oeffnet sich immer wieder" zeigt. multiprocessing.freeze_support() _ausgabe_richten() from rippy.windows_app import main as rippy_main return rippy_main() if __name__ == "__main__": sys.exit(main())