2013-12-16 58 views
9

我使用PyInstaller將我的應用程序捆綁到一個.exe文件中。 問題是使用--onedir選項可以正常工作,但使用--onefile生成時無法找到模塊。PyInstaller:一個模塊不包含在--onefile中,但與--onedir正常工作

兩個--onedir並在建設過程中--onefile說:

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

運行與--onedir工作正常創建的實例,但--onefile產生的實例終止:

<...> 
    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 

這裏是我的.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) 

回答

7

我有同樣的錯誤。解決方案是爲sklearn創建一個鉤子。 大體U需要創建一個鉤子文件中像這樣

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

,並在一個文件名hook-modulename.py在同一文件夾中保存此。但是這隻會導入_graph_validation。這可能會導致另一個模塊發生錯誤。 最好

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

導入包中的所有子模塊並將其保存到一個文件鉤在同一個文件夾中。對我來說,我必須創建2個鉤子文件。一個用於sklearn,一個用於scipy。

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

保存它們i之後使用下面的命令來運行

pyinstaller --additional鉤-DIR =。 myfile.py

更好地瞭解跟隨http://pythonhosted.org/PyInstaller/hooks.html#understanding-pyinstaller-hooks

+2

對於pyinstaller 3,您必須使用下面的代碼導入** ** collect_submodules: '從PyInstaller.utils.hooks導入collect_submodules' [PyInstaller文檔] (https://pythonhosted.org/PyInstaller/#useful-items-in-pyinstaller-utils-hooks) –

+0

你節省了我的一天謝謝 – x0v

相關問題