Message cosmétique sur Windows : "Prêt (NER indisponible : optimum.onnxruntime introuvable. Installez 'optimum' et 'onnxruntime')". Apparaît dans la barre de statut de la GUI quand EDS-Pseudo échoue à charger, et que le fallback ner_manager_onnx.py essaie d'utiliser optimum. Cause : 'optimum' n'était pas dans hiddenimports → PyInstaller ne le bundlait pas → ner_manager_onnx.py mettait ORTModelForTokenClassification = None au niveau module → l'appel à load() levait RuntimeError. Le pipeline principal (CamemBERT-bio ONNX + EDS-Pseudo + GLiNER) ne passe PAS par ner_manager_onnx.py — il utilise camembert_ner_manager.py qui charge directement l'ONNX via onnxruntime sans optimum. Donc le masquage fonctionne correctement malgré ce message. Mais le message inquiète l'utilisateur. Fix : ajouter optimum + sous-modules aux hiddenimports. Impact taille attendu : ~30-80 MB selon les dépendances embarquées. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
85 lines
3.4 KiB
Python
85 lines
3.4 KiB
Python
import os
|
|
block_cipher = None
|
|
app_dir = 'C:\\Users\\dom\\ai\\anonymisation'
|
|
|
|
datas = [
|
|
(os.path.join(app_dir, 'config'), 'config'),
|
|
(os.path.join(app_dir, 'data', 'bdpm'), os.path.join('data', 'bdpm')),
|
|
(os.path.join(app_dir, 'data', 'finess'), os.path.join('data', 'finess')),
|
|
(os.path.join(app_dir, 'data', 'insee'), os.path.join('data', 'insee')),
|
|
(os.path.join(app_dir, 'models', 'camembert-bio-deid', 'onnx'), os.path.join('models', 'camembert-bio-deid', 'onnx')),
|
|
(os.path.join(app_dir, 'detectors'), 'detectors'),
|
|
(os.path.join(app_dir, 'scripts'), 'scripts'),
|
|
]
|
|
# Fichiers directs dans data/ — IMPÉRATIF pour fonctionnement correct du core.
|
|
# Sans eux : stop-words/villes/DPI labels/companion blacklist sont des sets vides,
|
|
# ce qui dégrade la qualité d'anonymisation et peut masquer/laisser passer des faux-positifs.
|
|
for data_file in [
|
|
'stopwords_manuels.txt',
|
|
'villes_blacklist.txt',
|
|
'dpi_labels_blacklist.txt',
|
|
'companion_blacklist.txt',
|
|
]:
|
|
src = os.path.join(app_dir, 'data', data_file)
|
|
if os.path.exists(src):
|
|
datas.append((src, 'data'))
|
|
for pyfile in ['anonymizer_core_refactored_onnx.py', 'eds_pseudo_manager.py',
|
|
'gliner_manager.py', 'camembert_ner_manager.py',
|
|
'Pseudonymisation_Gui_V5.py']:
|
|
datas.append((os.path.join(app_dir, pyfile), '.'))
|
|
|
|
a = Analysis(
|
|
[os.path.join(app_dir, 'launcher.py')],
|
|
pathex=[app_dir],
|
|
datas=datas,
|
|
hiddenimports=[
|
|
'anonymizer_core_refactored_onnx', 'eds_pseudo_manager',
|
|
'gliner_manager', 'camembert_ner_manager', 'Pseudonymisation_Gui_V5',
|
|
'edsnlp', 'edsnlp.pipes', 'edsnlp.pipes.ner', 'edsnlp.pipes.ner.pseudo',
|
|
'spacy', 'spacy.lang.fr', 'gliner', 'onnxruntime',
|
|
'transformers', 'tokenizers', 'torch', 'pdfplumber',
|
|
'ahocorasick', 'sklearn', 'scipy', 'pydantic', 'yaml', 'PIL',
|
|
'loguru', 'regex',
|
|
# optimum : utilisé par ner_manager_onnx.py (fallback NER legacy).
|
|
# Sans ça, la GUI affiche "NER indisponible : optimum.onnxruntime introuvable"
|
|
# si EDS-Pseudo échoue. Le pipeline principal (CamemBERT-bio ONNX +
|
|
# EDS-Pseudo + GLiNER) n'en dépend pas — mais l'absence du hiddenimport
|
|
# crée un message d'erreur cosmétique gênant.
|
|
'optimum', 'optimum.onnxruntime', 'optimum.pipelines',
|
|
'optimum.modeling_base', 'optimum.exporters.onnx',
|
|
],
|
|
cipher=block_cipher,
|
|
noarchive=False,
|
|
)
|
|
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
|
|
# Splash natif PyInstaller : image affichée AU LANCEMENT DE L'EXE,
|
|
# avant même que Python démarre. Couvre les ~15-30 s de décompression
|
|
# du bundle --onefile dans %TEMP% qui laissaient l'écran vide auparavant.
|
|
# Le launcher ferme le splash via pyi_splash.close() une fois la GUI prête.
|
|
splash = Splash(
|
|
os.path.join(app_dir, 'assets', 'splash.png'),
|
|
binaries=a.binaries,
|
|
datas=a.datas,
|
|
# Texte dynamique PyInstaller positionné dans la zone libre du PNG
|
|
# (y=170-235). text_pos correspond au coin haut-gauche du texte.
|
|
text_pos=(60, 195),
|
|
text_size=10,
|
|
text_color='white',
|
|
minify_script=True,
|
|
always_on_top=False,
|
|
)
|
|
|
|
exe = EXE(
|
|
pyz, a.scripts,
|
|
splash, # image affichée immédiatement
|
|
splash.binaries, # bootloader splash
|
|
a.binaries, a.zipfiles, a.datas, [],
|
|
name='Anonymisation',
|
|
debug=False,
|
|
strip=False,
|
|
upx=False,
|
|
console=False,
|
|
icon=None,
|
|
)
|