From b2ee6ad835f65ecdc0c1422873fb53fd5751e906 Mon Sep 17 00:00:00 2001 From: Domi31tls Date: Mon, 30 Mar 2026 18:09:02 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20config=20externe=20=C3=A0=20c=C3=B4t?= =?UTF-8?q?=C3=A9=20de=20l'exe=20=E2=80=94=20mise=20=C3=A0=20jour=20sans?= =?UTF-8?q?=20recompiler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Au premier lancement, la config embarquée est copiée dans config/ à côté de l'exe. Les lancements suivants utilisent cette copie externe. Workflow de mise à jour : 1. L'établissement exporte ses paramètres (JSON) 2. On fusionne avec merge_params.py 3. On leur envoie le nouveau dictionnaires.yml par email 4. Ils le déposent dans config/ à côté de l'exe 5. Aucune recompilation nécessaire Co-Authored-By: Claude Opus 4.6 (1M context) --- Pseudonymisation_Gui_V5.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/Pseudonymisation_Gui_V5.py b/Pseudonymisation_Gui_V5.py index 2aad33f..06e0f2a 100644 --- a/Pseudonymisation_Gui_V5.py +++ b/Pseudonymisation_Gui_V5.py @@ -22,6 +22,7 @@ import queue import re import shutil import subprocess +import sys import threading from dataclasses import dataclass, field from pathlib import Path @@ -89,10 +90,39 @@ APP_TITLE = "Pseudonymisation de vos documents" APP_VERSION = "v5.4" def _app_dir() -> Path: - """Répertoire racine de l'application (compatible Nuitka standalone).""" + """Répertoire racine de l'application (compatible PyInstaller/Nuitka).""" + if getattr(sys, 'frozen', False): + return Path(sys._MEIPASS) return Path(__file__).resolve().parent -DEFAULT_CFG = _app_dir() / "config" / "dictionnaires.yml" +def _exe_dir() -> Path: + """Répertoire de l'exécutable (pour les fichiers persistants : config, logs).""" + if getattr(sys, 'frozen', False): + return Path(sys.executable).parent + return Path(__file__).resolve().parent + +def _resolve_config() -> Path: + """Cherche la config en priorité à côté de l'exe, sinon dans l'app embarquée. + + Si le fichier n'existe pas à côté de l'exe, copie la version embarquée + pour que l'utilisateur puisse la modifier sans recompiler. + """ + exe_cfg = _exe_dir() / "config" / "dictionnaires.yml" + app_cfg = _app_dir() / "config" / "dictionnaires.yml" + + if exe_cfg.exists(): + return exe_cfg + + # Premier lancement : copier la config embarquée à côté de l'exe + if app_cfg.exists(): + exe_cfg.parent.mkdir(parents=True, exist_ok=True) + import shutil + shutil.copy2(str(app_cfg), str(exe_cfg)) + return exe_cfg + + return app_cfg # fallback + +DEFAULT_CFG = _resolve_config() MODELS_DIR = _app_dir() / "models" DEFAULTS_CFG_TEXT = r"""