2013-12-16 12 views
9

Sto usando PyInstaller per raggruppare la mia applicazione in un file .exe. Il problema è che funziona bene con l'opzione --onedir, ma non riesce a trovare un modulo quando è stato creato con --onefile.PyInstaller: un modulo non è incluso in --onefile, ma funziona bene con --onedir

Sia --onedir e --onefile dire durante il processo di costruzione:

<...> 
INFO: Analyzing hidden import 'sklearn.utils.sparsetools._graph_validation' 
<...> 

che esegue l'istanza creata con --onedir funziona bene, ma l'istanza prodotta da --onefile muore:

<...> 
    File "_min_spanning_tree.pyx", line 8, in init sklearn.utils.mst._min_spanning 
_tree (sklearn\utils\sparsetools\_min_spanning_tree.c:4754) 
ImportError: No module named _graph_validation 

Qui sono i miei file .spec

onedir.spec

# -*- mode: python -*- 
a = Analysis(['../../brainactivity.py'], 
      hiddenimports=['greenlet', 'sklearn.utils.sparsetools._graph_validation', 'sklearn.utils.sparsetools._graph_tools', 'scipy.special._ufuncs_cxx', 'sklearn.utils.lgamma', 'sklearn.utils.weight_vector'], 
      hookspath=None, 
      runtime_hooks=None) 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      exclude_binaries=True, 
      name='brainactivity.exe', 
      debug=False, 
      strip=None, 
      upx=True, 
      console=True,) 
coll = COLLECT(exe, 
       a.binaries, 
       [('./data/201305182224-DF-facial-3-420.csv', '../../data/201305182224-DF-facial-3-420.csv', 'DATA')], 
       [('./model/brain_20k_colored_properly.obj', '../../model/brain_20k_colored_properly.obj', 'DATA')], 
       [('brain_fragment_shader.glsl', '../../brain_fragment_shader.glsl', 'DATA')], 
       [('brain_vertex_shader.glsl', '../../brain_vertex_shader.glsl', 'DATA')], 
       a.zipfiles, 
       a.datas, 
       strip=None, 
       upx=True, 
       name='brainactivity') 

onefile.spec

# -*- mode: python -*- 
a = Analysis(['../../brainactivity.py'], 
      hiddenimports=['greenlet', 'sklearn.utils.sparsetools._graph_validation', 'sklearn.utils.sparsetools._graph_tools', 'scipy.special._ufuncs_cxx', 'sklearn.utils.lgamma', 'sklearn.utils.weight_vector'], 
      hookspath='.', 
      runtime_hooks=None) 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      [('./data/201305182224-DF-facial-3-420.csv', '../../data/201305182224-DF-facial-3-420.csv', 'DATA')], 
      [('./model/brain_20k_colored_properly.obj', '../../model/brain_20k_colored_properly.obj', 'DATA')], 
      [('brain_fragment_shader.glsl', '../../brain_fragment_shader.glsl', 'DATA')], 
      [('brain_vertex_shader.glsl', '../../brain_vertex_shader.glsl', 'DATA')], 
      a.zipfiles, 
      a.datas, 
      name='brainactivity.exe', 
      debug=False, 
      strip=None, 
      upx=True, 
      console=True) 

risposta

7

ho avuto lo stesso errore. La soluzione è creare un hook per sklearn. Generalmente u bisogno di creare un file di gancio come questo

hiddenimports = ['sklearn.utils.sparsetools._graph_validation'] 

e salvare questo in un file con nome hook-modulename.py nella stessa cartella. Ma questo importerà solo _graph_validation. Ciò potrebbe causare errori per un altro modulo. migliore per importare tutti i moduli in un pacchetto da

from hookutils import collect_submodules 
hiddenimports = collect_submodules('sklearn') 

e salvarlo in un file gancio nella stessa cartella. Per me ho dovuto creare 2 file di hook. uno per sklearn e uno per scipy.

from hookutils import collect_submodules 
hiddenimports = collect_submodules('scipy') 

dopo averli salvati ho usato sotto comando per eseguire =

pyinstaller --additional-ganci-dir. myfile.py

per una migliore comprensione seguire http://pythonhosted.org/PyInstaller/hooks.html#understanding-pyinstaller-hooks

+2

Per pyinstaller 3 è necessario utilizzare il seguente codice per importare collect_submodules ** **: 'da PyInstaller.utils.hooks importare collect_submodules' [Documentazione PyInstaller] (https://pythonhosted.org/PyInstaller/#useful-items-in-pyinstaller-utils-hooks) –

+0

Hai salvato la mia giornata Grazie – x0v