2013-12-16 57 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

相关问题