Próbuję dowiedzieć się, jak obciążenie dynamiczne/importu z PyInstaller ukryte dotąd mam tę prostą strukturę:Jak dodać dynamiczne moduły python do specyfikacji PyInstaller?
Przede wszystkim, mam pakiet ramy dodany do mojego PYTHONPATH żyjących w d:\Sources\personal\python\framework
pakiet ten jest używany przez wielu moich projektów Pythona, w szczególności, jest używany z poniżej prostego projektu chcę pakować
Main project
├───data <- Pure static data
├───plugins <- Dynamic modules which uses framework's modules
├───resources <- Static data+embedded (generated by pyqt), used by plugins
│ ├───css
│ ├───images
| resources.py
| resources.qrc
main.py <- Uses framework's modules to load plugins dynamically
Mój plik spec wygląda następująco:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['d:\\sources\\personal\\python\\pyqt\\pyshaders'],
binaries=None,
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
##### include mydir in distribution #######
def extra_datas(mydir):
def rec_glob(p, files):
import os
import glob
for d in glob.glob(p):
if os.path.isfile(d):
files.append(d)
rec_glob("%s/*" % d, files)
files = []
rec_glob("%s/*" % mydir, files)
extra_datas = []
for f in files:
extra_datas.append((f, f, 'DATA'))
return extra_datas
###########################################
a.datas += extra_datas('data')
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='main',
debug=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='main')
Problem pojawia się, gdy próbuję dodać ukryte importu do analizy (... hiddenimports = [], ...) 's lista hiddenimports, próbowałem do tej pory to:
hiddenimports=['d:\\sources\\personal\\python\\pyqt\\plugins']
hiddenimports=['d:\\sources\\personal\\python\\pyqt\\plugins\\*']
hiddenimports=['plugins']
próbował także wymieniając jako pojedyncze pliki z bezwzględnych ścieżek:
hiddenimports=[
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\api.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\config.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_actions.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_dialogs.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_docks.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_post_init.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_toolbar.py'
]
I również próbował załadować je jako opakowań modułowych (__init__.py
życie w folderze plugins)
hiddenimports=[
'plugins.api',
'plugins.config',
'plugins.plugins_actions',
'plugins.plugins_dialogs',
'plugins.plugins_docks',
'plugins.plugins_post_init',
'plugins.plugins_toolbar'
]
Próbowałem też collect_submodules
hiddenimports=collect_submodules('plugins')
Żadna z tych prób pracowali i ISN folderze wtyczek” t są właściwie dodawane do dist (kiedy mówię "poprawnie", myślę, że pirinstalator przeanalizuje import używanych przez te ukryte wtyczki analizujących rekursywnie ich zależności i kopiujących pliki * .pyc) ... więc chciałbym wiedzieć jak czy mogę reklamować d poprawnie "ukryte" moduły, które są dynamicznie ładowane do specyfikacji Pyinstallera.
Możesz spróbować dodać pliki w zależnościach ['pure'] (https://pythonhosted.org/PyInstaller/spec-files.html#spec-file- operation) używając [' TOC'] (https: //pythonhosted.org/PyInstaller/advanced-topics.html#toc-class-table-of-contents). – Repiklis
Prawdopodobnie problem ten (https://github.com/pyinstaller/pyinstaller/issues/2009)? –
Czy próbowałeś używać haków PyInstaller (https://pyinstaller.readthedocs.io/en/stable/hooks.html)? Są zaprojektowane dokładnie w tym celu. – void