diff --git a/engine.spec b/engine.spec index d95a31e..1133b37 100644 --- a/engine.spec +++ b/engine.spec @@ -48,14 +48,35 @@ datas += collect_data_files('librosa', includes=['**/*.pyi']) # scipy >= 1.18 tach scipy.stats thanh nhieu module con (vd # _ansari_swilk_statistics) import lazy ben trong ham -> hook scipy cua -# PyInstaller miss -> ModuleNotFoundError luc runtime. Collect toan bo -# submodules cua scipy de khong sot module nao (stats/signal/ndimage...). -_scipy_hidden = collect_submodules('scipy') +# PyInstaller miss -> ModuleNotFoundError luc runtime. Giai phap TRIET DE: +# scan FILESYSTEM toan bo site-packages/scipy (khong import, khong walk — +# pkgutil.walk_packages BO QUA AM THAM subpackage import loi luc build, +# da gap: may user mat ca cay scipy.sparse.csgraph._shortest_path). +# Bat moi module .py + C-extension .pyd/.so -> hiddenimports day du. +import importlib.util as _ilu +import glob as _glob +_scipy_spec = _ilu.find_spec('scipy') +_scipy_dir = _os.path.dirname(_os.path.abspath(_scipy_spec.origin)) +_scipy_hidden = [] +for _ext in ('*.py', '*.pyd', '*.so'): + for _f in _glob.glob(_os.path.join(_scipy_dir, '**', _ext), recursive=True): + _rel = _os.path.relpath(_f, _scipy_dir) + _base = _os.path.basename(_rel).split('.')[0] # bo .cpython-312-x86_64... .so + _pkg = _os.path.dirname(_rel).replace(_os.sep, '.') + _mod = ('scipy.' + _pkg + '.' + _base) if _pkg else ('scipy.' + _base) + if _mod not in _scipy_hidden: + _scipy_hidden.append(_mod) # Cung co bang hiddenimport TINH: _morestats import module nay o top-level # (scipy 1.18+); collect_submodules du phong nhung neu miss (version khac # tren may user) thi dong nay van dam bao bundle co. if 'scipy.stats._ansari_swilk_statistics' not in _scipy_hidden: _scipy_hidden.append('scipy.stats._ansari_swilk_statistics') +# scipy.sparse.csgraph cung lazy-import C-extension tu ben trong ham (vd +# _shortest_path, _traversal, _matching) — hiddenimport tinh phong walk miss. +for _m in ('scipy.sparse.csgraph._shortest_path', 'scipy.sparse.csgraph._traversal', + 'scipy.sparse.csgraph._matching', 'scipy.sparse.csgraph._min_spanning_tree'): + if _m not in _scipy_hidden: + _scipy_hidden.append(_m) a = Analysis( ['desktop_engine.py'],