From 422ba0a8c4616b2141c09b80e2345b5b4475002f Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 19 Jun 2025 16:30:12 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 98 +++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 1a8259998..65c5b3da6 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -10280,33 +10280,66 @@ class DataProcessor: # Der globale Root Logger wird in main() konfiguriert # logger = logging.getLogger(__name__) # Diesen Logger gibt es schon, keine Neudefinition hier +def parse_arguments(): + """ + Parst und validiert Kommandozeilen-Argumente. + """ + parser = argparse.ArgumentParser(description="Automatisierte Unternehmensbewertung v1.7.8") + parser.add_argument( + '--mode', type=str, choices=[ + 'full_run', 'reeval', 'find_wiki_serp', 'website_lookup', 'check_urls', + 'contacts', 'update_wiki_suggestions', 'wiki_reextract_missing_an', + 'website_details', 'train_technician_model', 'alignment', 'reparatur_sitz', + 'plausi_check_data', 'combined_all', 'branch_eval', 'suggest_parents', 'analyze_ml_by_branch' + ], + help="Ausführungsmodus des Skripts." + ) + parser.add_argument('--limit', type=int, help="Maximale Anzahl zu verarbeitender Zeilen.") + parser.add_argument('--start_sheet_row', type=int, help="Startzeile im Google Sheet (1-basiert).") + parser.add_argument('--end_sheet_row', type=int, help="Endzeile im Google Sheet (inklusiv).") + parser.add_argument( + '--steps', type=str, + default='wiki,chat,web,ml_predict', + help="Zu durchlaufende Schritte, kommagetrennt (z.B. 'wiki,chat'). Standard: 'wiki,chat,web,ml_predict'" + ) + # Argumente für find_wiki_serp + parser.add_argument('--min_employees', type=int, default=500, help="Mindestanzahl Mitarbeiter für find_wiki_serp Modus.") + parser.add_argument('--min_umsatz', type=float, default=200.0, help="Mindestumsatz in Mio. € für find_wiki_serp Modus.") + + # Argumente für das Speichern von ML-Modellen + parser.add_argument('--model_out', type=str, default=MODEL_FILE, help="Ausgabepfad für das trainierte ML-Modell.") + parser.add_argument('--imputer_out', type=str, default=IMPUTER_FILE, help="Ausgabepfad für den trainierten Imputer.") + parser.add_argument('--patterns_out', type=str, default=PATTERNS_FILE_JSON, help="Ausgabepfad für die Feature-Patterns (JSON).") + + return parser.parse_args() + + def main(): """ Haupteinstiegspunkt des Skripts. Verarbeitet Kommandozeilen-Argumente, richtet Logging ein, initialisiert Komponenten und dispatchet zu den passenden Modi. """ - # WICHTIG: Globale Variable LOG_FILE wird benoetigt (Initialisierung Block 3) + # 1. Argumente parsen + args = parse_arguments() + + # 2. Logging konfigurieren global LOG_FILE - logger = logging.getLogger(__name__) # <<< JETZT AN DER RICHTIGEN STELLE - - # --- Initial Logging Setup (Konfiguration von Level und Format) --- - # Diese Konfiguration wird wirksam, sobald die Handler hinzugefuegt werden. - # Standard-Logging Level festlegen (aus Config Block 1) log_level = logging.DEBUG if getattr(Config, 'DEBUG', False) else logging.INFO - log_format = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' # <<< DIESE ZEILE HINZUFÜGEN/KORRIGIEREN - - # Root-Logger konfigurieren (mit Console Handler, File Handler wird spaeter hinzugefuegt) - # handlers=[] verhindert default Console Handler, wir fuegen ihn manuell hinzu fuer mehr Kontrolle - logging.basicConfig(level=log_level, format=log_format, handlers=[]) # log_format wird hier bereits verwendet - - logger.info("Lade Konfigurationsdaten...") + log_format = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' - # Lade die Schemata und Mappings NACH dem Logging-Setup + # Sofort einen Konsolen-Handler hinzufügen, damit frühe Meldungen sichtbar sind + logging.basicConfig(level=log_level, format=log_format, handlers=[logging.StreamHandler()]) + + logger = logging.getLogger(__name__) + + # 3. Globale Konfigurationsdaten laden (jetzt wo das Logging läuft) + logger.info("Lade Konfigurationsdateien...") + Config.load_api_keys() ziel_schema, fokus_branchen = load_target_schema() branch_mapping_dict = load_branch_mapping() - # Wenn das Laden fehlschlägt, können wir hier sicher abbrechen + # Prüfung, ob das Laden erfolgreich war if not ziel_schema: logger.critical("Ziel-Branchenschema konnte nicht geladen werden. Skriptabbruch.") return @@ -10314,43 +10347,16 @@ def main(): logger.critical("Branchen-Mapping konnte nicht geladen werden. Skriptabbruch.") return - args = parse_arguments() - - # Initialisiere den DataProcessor und übergebe ihm die geladenen Daten + # 4. Hauptkomponenten initialisieren und die geladenen Daten übergeben + logger.info("Initialisiere Hauptkomponenten...") sheet_handler = GoogleSheetHandler(Config.SHEET_ID, Config.SERVICE_ACCOUNT_FILE, Config.TOKEN_FILE) wiki_scraper = WikipediaScraper() - - # +++ WICHTIGE ÄNDERUNG HIER +++ - # Wir übergeben die Daten an den Konstruktor data_processor = DataProcessor(sheet_handler, wiki_scraper, ziel_schema, fokus_branchen, branch_mapping_dict) logger.info("DataProcessor erfolgreich initialisiert.") - - ZIEL_BRANCHENSCHEMA, FOKUS_BRANCHEN = load_target_schema() # Zeile 10277 - BRANCH_MAPPING = load_branch_mapping() - - # Console Handler explizit hinzufuegen - console_handler = logging.StreamHandler() - console_handler.setLevel(log_level) # Nimm das globale Level - console_handler.setFormatter(logging.Formatter(log_format)) # Jetzt sollte log_format definiert sein - # Pruefen, ob nicht schon ein Console Handler vorhanden ist (z.B. bei wiederholten Aufrufen in Tests) - if not any(isinstance(h, logging.StreamHandler) for h in logging.getLogger('').handlers): - logging.getLogger('').addHandler(console_handler) - - - # Testnachricht (geht nur an Konsole, da File Handler noch fehlt) - logger.debug("DEBUG Logging initial konfiguriert (nur Konsole).") - logger.info("INFO Logging initial konfiguriert (nur Konsole).") - - - # --- Initialisierung (Argument Parser) --- - current_script_version = getattr(Config, 'VERSION', 'unknown') # Aus Config Block 1 - - parser = argparse.ArgumentParser( - description=f"Firmen-Datenanreicherungs-Skript {current_script_version}. Automatisiert Anreicherung und Validierung aus Google Sheets.", - formatter_class=argparse.RawTextHelpFormatter # Behaelt Formatierung im Help-Text - ) + # 5. Modus-Dispatching (der Rest Ihrer main-Funktion) + start_time = time.time() # Liste der gueltigen Modi - MUSS mit den elif-Zweigen unten uebereinstimmen! # Kategorisiert fuer die Menue-Ausgabe