From affba2a9cafc86cd8cc7ab3c536117036bab87e7 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Sun, 15 Feb 2026 19:51:58 +0100 Subject: [PATCH] =?UTF-8?q?Fix:=20PyInstaller-Bundle=20f=C3=BCr=20installi?= =?UTF-8?q?erte=20Version=20repariert=20(connectorx,=20SQL-Ressourcen)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - connectorx via collect_all() eingebunden statt hiddenimports (Rust-PYD + __init__.py + Metadaten als Einheit) - SQL/CSV-Ressourcen (src/res/) ins PyInstaller-Bundle aufgenommen - Pfadauflösung in database.py auf sys._MEIPASS umgestellt für installierten Modus - connectorx als explizite Abhängigkeit in pyproject.toml ergänzt - Dokumentation (windows_distribution.md) um collect_all-Pattern und _MEIPASS-Hinweise erweitert - Version auf 1.0.0 aktualisiert, Hersteller-Informationen ergänzt --- DocuMentor.spec | 52 ++++++++++++++---------- DocuMentor.wxs | 4 +- create_version_info.py | 6 +-- docs/windows_distribution.md | 77 ++++++++++++++++++++++++------------ pyproject.toml | 3 +- src/ui/mixins/database.py | 8 +++- uv.lock | 4 +- 7 files changed, 100 insertions(+), 54 deletions(-) diff --git a/DocuMentor.spec b/DocuMentor.spec index 1510d30..1aad251 100644 --- a/DocuMentor.spec +++ b/DocuMentor.spec @@ -4,25 +4,36 @@ PyInstaller Konfiguration für DocuMentor Erstellt eine eigenständige Windows-Executable ohne Python-Installation """ -import sys -from pathlib import Path - -block_cipher = None - -# Projektpfad -project_root = Path(SPECPATH) -src_path = project_root / 'src' - -# Alle UI-Dateien sammeln -ui_files = [] -for ui_file in (src_path / 'ui').glob('*.ui'): - ui_files.append((str(ui_file), 'ui')) - -a = Analysis( - [str(src_path / 'main.py')], - pathex=[str(src_path)], - binaries=[], - datas=ui_files, # UI-Dateien einbinden +import sys +from pathlib import Path +from PyInstaller.utils.hooks import collect_all + +block_cipher = None + +# Projektpfad +project_root = Path(SPECPATH) +src_path = project_root / 'src' + +# connectorx komplett sammeln (Python-Code, native .pyd und Metadaten) +# PyInstaller erkennt connectorx nicht automatisch, da es zur Laufzeit +# von polars per importlib.import_module() geladen wird +cx_datas, cx_binaries, cx_hiddenimports = collect_all('connectorx') + +# Alle UI-Dateien sammeln +ui_files = [] +for ui_file in (src_path / 'ui').glob('*.ui'): + ui_files.append((str(ui_file), 'ui')) + +# Ressource-Dateien (SQL, CSV) einbinden +res_files = [] +for res_file in (src_path / 'res').glob('*'): + res_files.append((str(res_file), 'res')) + +a = Analysis( + [str(src_path / 'main.py')], + pathex=[str(src_path)], + binaries=cx_binaries, + datas=ui_files + res_files + cx_datas, hiddenimports=[ 'PySide6.QtCore', 'PySide6.QtGui', @@ -32,8 +43,7 @@ a = Analysis( 'pydantic_yaml', 'polars', 'pyarrow', - 'connectorx', - ], + ] + cx_hiddenimports, hookspath=[], hooksconfig={}, runtime_hooks=[], diff --git a/DocuMentor.wxs b/DocuMentor.wxs index 0987872..c98dce1 100644 --- a/DocuMentor.wxs +++ b/DocuMentor.wxs @@ -4,8 +4,8 @@