diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 354dd233..dc9b4b7a 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -2462,15 +2462,16 @@ class DataProcessor: debug_print(f"Modus 22 abgeschlossen. {rows_processed} Websites ergänzt.") +# ==================== MAIN FUNCTION ==================== # ==================== MAIN FUNCTION ==================== def main(): - global MODE, LOG_FILE # MODE wird nicht mehr global benötigt, aber LOG_FILE schon + global MODE, LOG_FILE # MODE wieder global, da es in älteren Teilen evtl. noch referenziert wird? Besser wäre es zu übergeben. # --- Initialisierung --- # Argument Parser parser = argparse.ArgumentParser(description="Firmen-Datenanreicherungs-Skript") parser.add_argument("--mode", type=str, help="Betriebsmodus (z.B. combined, wiki, website, branch, reeval, website_lookup, website_details, contacts, full_run)") - parser.add_argument("--limit", type=int, help="Maximale Anzahl zu verarbeitender Zeilen (für Batch/sequentielle Modi)", default=None) + parser.add_argument("--limit", type=int, help="Maximale Anzahl zu verarbeitender Zeilen (für Batch/sequentielle Modi)", default=None) # Korrekter Name: --limit args = parser.parse_args() # Lade API Keys @@ -2479,21 +2480,14 @@ def main(): # Betriebsmodus ermitteln valid_modes = ["combined", "wiki", "website", "branch", "reeval", "website_lookup", "website_details", "contacts", "full_run"] mode = None + # --> NEUE LOGIK: Priorisiere Kommandozeilenargumente if args.mode and args.mode.lower() in valid_modes: mode = args.mode.lower() print(f"Betriebsmodus (aus Kommandozeile): {mode}") else: + # Nur wenn KEIN Modus über die Kommandozeile kam, FRAGE interaktiv print("Bitte wählen Sie den Betriebsmodus:") - print(" combined: Wiki-Verifizierung, Website-Scraping & Branch-Einschätzung (Batch, ab erster leerer Zeile)") - print(" wiki: Nur Wikipedia-Verifizierung (Batch, ab erster leerer Zeile)") - print(" website: Nur Website-Scraping & Zusammenfassung (Batch, ab erster leerer Zeile)") - print(" branch: Nur Branchen-Einschätzung (Batch, ab erster leerer Zeile)") - print(" reeval: Verarbeitet alle Zeilen mit 'x' in Spalte A (volle Verarbeitung)") - print(" website_lookup: Sucht fehlende Websites (Spalte D) via SERP API") - print(" website_details:Extrahiert Title/Desc/H-Tags für Zeilen mit 'x' in Spalte A") - print(" contacts: Sucht LinkedIn Kontakte via SERP API und schreibt in 'Contacts' Blatt") - print(" full_run: Verarbeitet alle Zeilen sequentiell ab der ersten ohne Zeitstempel (AO)") - # print(" 8: Batch Token-Zählung (Platzhalter)") # Modus 8 entfernt/umbenannt? + # ... (Liste der Modi ausgeben) ... mode_input = input(f"Geben Sie den Modus ein ({', '.join(valid_modes)}): ").strip().lower() if mode_input in valid_modes: mode = mode_input @@ -2502,8 +2496,13 @@ def main(): mode = "combined" # Standardmodus # Zeilenlimit ermitteln - row_limit = args.limit - if row_limit is None and mode in ["combined", "wiki", "website", "branch", "full_run"]: + row_limit = None + # --> NEUE LOGIK: Priorisiere Kommandozeilenargumente + if args.limit is not None: # Prüfe, ob --limit gesetzt wurde + row_limit = args.limit + print(f"Zeilenlimit (aus Kommandozeile): {row_limit}") + # Nur wenn KEIN Limit über die Kommandozeile kam UND es ein Modus ist, der ein Limit brauchen könnte, FRAGE interaktiv + elif mode in ["combined", "wiki", "website", "branch", "full_run"]: try: limit_input = input("Wie viele Zeilen sollen maximal bearbeitet werden? (Enter für alle) ") if limit_input.strip(): @@ -2515,77 +2514,26 @@ def main(): except ValueError: print("Ungültige Eingabe für Zeilenlimit. Es werden alle Zeilen verarbeitet.") row_limit = None - elif row_limit is not None: - print(f"Zeilenlimit (aus Kommandozeile): {row_limit}") + # Füge eine Sicherheitsprüfung hinzu, falls input() in nohup aufgerufen würde + except OSError as e: + if e.errno == 9: # Bad file descriptor + print("Warnung: Interaktive Abfrage des Limits nicht möglich (läuft im Hintergrund?). Kein Limit gesetzt.") + row_limit = None + else: + raise # Anderen OSError weiterwerfen + # --- Rest der main() Funktion bleibt gleich --- # Logfile initialisieren LOG_FILE = create_log_filename(mode) - debug_print(f"===== Skript gestartet =====") - debug_print(f"Version: {Config.VERSION}") - debug_print(f"Betriebsmodus: {mode}") - debug_print(f"Zeilenlimit: {row_limit if row_limit is not None else 'Unbegrenzt'}") - debug_print(f"Logdatei: {LOG_FILE}") - - # --- Vorbereitung --- - # Lade Branchenschema - load_target_schema() - - # Initialisiere Google Sheet Handler - try: - sheet_handler = GoogleSheetHandler() - except Exception as e: - debug_print(f"FATAL: Konnte Google Sheet Handler nicht initialisieren: {e}") - return # Abbruch - - # Initialisiere DataProcessor - data_processor = DataProcessor(sheet_handler) - - # Optional: Alignment Demo für Hauptblatt ausführen? - # run_alignment = input("Sollen die Header im Hauptblatt aktualisiert werden (Alignment Demo)? (j/N): ").lower() - # if run_alignment == 'j': - # alignment_demo(sheet_handler.sheet) - - # --- Modusausführung --- - start_time = time.time() - debug_print(f"Starte Verarbeitung um {datetime.now().strftime('%H:%M:%S')}...") - - try: - if mode in ["wiki", "website", "branch", "combined"]: - run_dispatcher(mode, sheet_handler, row_limit) - elif mode == "reeval": - data_processor.process_reevaluation_rows() - elif mode == "website_lookup": - data_processor.process_serp_website_lookup_for_empty() - elif mode == "website_details": - data_processor.process_website_details_for_marked_rows() - elif mode == "contacts": - process_contact_research(sheet_handler) # Übergib den Handler - elif mode == "full_run": - start_index = sheet_handler.get_start_row_index() # Index in Datenliste - num_to_process = row_limit if row_limit is not None else len(sheet_handler.get_data()) - start_index - if num_to_process > 0: - data_processor.process_rows_sequentially(start_index, num_to_process, process_wiki=True, process_chatgpt=True, process_website=True) - else: - debug_print("Keine Zeilen für 'full_run' zu verarbeiten.") - # elif mode == "8": # Token Count - was soll hier passieren? - # debug_print("Modus 8 (Token Count) ist derzeit nicht implementiert.") - else: - debug_print(f"Unbekannter Modus '{mode}' - keine Aktion ausgeführt.") - - except Exception as e: - debug_print(f"FATAL: Unerwarteter Fehler auf oberster Ebene: {e}") - import traceback - debug_print(traceback.format_exc()) # Detaillierten Stacktrace loggen - - # --- Abschluss --- - end_time = time.time() - duration = end_time - start_time - debug_print(f"Verarbeitung abgeschlossen um {datetime.now().strftime('%H:%M:%S')}.") - debug_print(f"Gesamtdauer: {duration:.2f} Sekunden.") - debug_print(f"===== Skript beendet =====") - print(f"Verarbeitung abgeschlossen. Logfile: {LOG_FILE}") + # ... (Logging der Startparameter) ... + # ... (Schema laden) ... + # ... (Sheet Handler initialisieren) ... + # ... (DataProcessor initialisieren) ... + # ... (Modusausführung) ... + # ... (Abschluss) ... +# (Der Rest der Datei bleibt unverändert) if __name__ == '__main__': main() \ No newline at end of file