2016-11-09 39 views
19

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.

+0

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

+0

Prawdopodobnie problem ten (https://github.com/pyinstaller/pyinstaller/issues/2009)? –

+0

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

Odpowiedz

1

Miałem problem z pakowaniem aplikacji PyQt z Py2Exe (również zmagałem się z PyInstaller i cx_freeze, ale pomógł mi tylko py2exe).

Oto szczegółowe solution. Dodałem je jawnie jako:

data_files += [('source', glob('source/*.py'),)] 
setup(
     data_files=data_files, 
     .... # other options 
     windows=[ 
     { 
      "script": "launcher.py", 
      "icon_resources": [(0, "resources/favicon.ico")] 
     } 
    ) 

Potem je importuję i dzwoń. Mam nadzieję, że takie podejście przyda się.