diff --git a/brancheneinstufung2.py b/brancheneinstufung2.py index 8528b205..6ea93167 100644 --- a/brancheneinstufung2.py +++ b/brancheneinstufung2.py @@ -1,5 +1,3 @@ -# --- START OF FILE brancheneinstufung.py --- - #!/usr/bin/env python3 """ brancheneinstufung.py - Hauptskript v1.8.0 @@ -19,31 +17,35 @@ import time from datetime import datetime # Import der Projekt-Module +# Wichtig: Config muss zuerst importiert werden, damit die DEBUG-Variable verfügbar ist. from config import Config from helpers import create_log_filename, initialize_target_schema, alignment_demo from google_sheet_handler import GoogleSheetHandler from wikipedia_scraper import WikipediaScraper from data_processor import DataProcessor +# ============================================================================== +# 1. INITIALE KONFIGURATION (wird vor allem anderen ausgeführt) +# ============================================================================== + +# Logging sofort konfigurieren, damit es für alle importierten Module greift. +LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO +LOG_FORMAT = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' +logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT, force=True, handlers=[logging.StreamHandler()]) + +# Haupt-Logger für dieses Skript +logger = logging.getLogger(__name__) + +# ============================================================================== +# 2. HAUPTFUNKTION +# ============================================================================== + def main(): """ Haupteinstiegspunkt des Skripts. Verarbeitet Kommandozeilen-Argumente, richtet Logging ein, initialisiert Komponenten und dispatchet zu den passenden Modi. """ - # --- Initiales Logging Setup (vor File Handler) --- - log_level = logging.DEBUG if Config.DEBUG else logging.INFO - log_format = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' - logging.basicConfig(level=log_level, format=log_format, handlers=[]) - console_handler = logging.StreamHandler() - console_handler.setLevel(log_level) - console_handler.setFormatter(logging.Formatter(log_format)) - if not any(isinstance(h, logging.StreamHandler) for h in logging.getLogger('').handlers): - logging.getLogger('').addHandler(console_handler) - - logger = logging.getLogger(__name__) - logger.debug("Initiales Konsolen-Logging konfiguriert.") - # --- Argument Parser --- parser = argparse.ArgumentParser( description=f"Firmen-Datenanreicherungs-Skript {Config.VERSION}.", @@ -103,12 +105,12 @@ def main(): print("\nAbgebrochen.") return - # --- Logging-Konfiguration abschließen --- + # --- Logdatei-Konfiguration abschließen --- log_file_path = create_log_filename(selected_mode) if log_file_path: file_handler = logging.FileHandler(log_file_path, mode='a', encoding='utf-8') - file_handler.setLevel(log_level) - file_handler.setFormatter(logging.Formatter(log_format)) + file_handler.setLevel(LOG_LEVEL) + file_handler.setFormatter(logging.Formatter(LOG_FORMAT)) logging.getLogger('').addHandler(file_handler) logger.info(f"===== Skript gestartet: Modus '{selected_mode}' =====") @@ -125,7 +127,7 @@ def main(): wiki_scraper = WikipediaScraper() data_processor = DataProcessor(sheet_handler=sheet_handler, wiki_scraper=wiki_scraper) - # NEU: Expliziter Setup-Aufruf, nachdem alle Konfigurationen geladen sind. + # Expliziter Setup-Aufruf, nachdem alle Konfigurationen geladen sind. if not data_processor.setup(): logger.critical("Setup des DataProcessors fehlgeschlagen. Das Skript wird beendet.") return @@ -137,7 +139,6 @@ def main(): steps_to_run_set = set(step.strip().lower() for step in args.steps.split(',') if step.strip() in valid_steps) if args.steps else set(valid_steps) if selected_mode == "full_run": - # BUGFIX: header_rows war hier nicht definiert. Hole es aus dem sheet_handler. start_row = args.start_sheet_row or sheet_handler.get_start_row_index("Timestamp letzte Pruefung") + sheet_handler._header_rows + 1 num_to_process = args.limit or (len(sheet_handler.get_all_data_with_headers()) - start_row + 1) data_processor.process_rows_sequentially( @@ -162,7 +163,6 @@ def main(): elif hasattr(data_processor, f"process_{selected_mode}"): # Dynamischer Aufruf für die meisten Batch-Modi method_to_call = getattr(data_processor, f"process_{selected_mode}") - # Nur relevante Argumente übergeben method_args = {} if "limit" in method_to_call.__code__.co_varnames: method_args["limit"] = args.limit if "start_sheet_row" in method_to_call.__code__.co_varnames: method_args["start_sheet_row"] = args.start_sheet_row @@ -185,14 +185,13 @@ def main(): except Exception as e: logger.critical(f"FATAL: Unerwarteter Fehler im Hauptprozess: {e}", exc_info=True) print(f"\n! Ein kritischer Fehler ist aufgetreten: {e}") - print(f"Bitte pruefen Sie die Logdatei fuer Details: {log_file_path}") + if log_file_path: # Nur ausgeben, wenn Pfad existiert + print(f"Bitte pruefen Sie die Logdatei fuer Details: {log_file_path}") finally: logger.info(f"===== Skript beendet =====") logging.shutdown() - if log_file_path: + if 'selected_mode' in locals() and selected_mode != 'exit' and log_file_path: print(f"\nVerarbeitung abgeschlossen. Logfile: {log_file_path}") if __name__ == '__main__': - main() - -# --- END OF FILE brancheneinstufung.py --- \ No newline at end of file + main() \ No newline at end of file