【问题标题】:PyInstaller: a module is not included into --onefile, but works fine with --onedirPyInstaller:一个模块不包含在 --onefile 中,但可以与 --onedir 一起使用
【发布时间】:2014-01-03 08:38:05
【问题描述】:

我正在使用 PyInstaller 将我的应用程序捆绑到一个 .exe 文件中。 问题是它使用 --onedir 选项可以正常工作,但是使用 --onefile 构建时找不到模块。

在构建过程中 --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 )

【问题讨论】:

    标签: scikit-learn pyinstaller file-not-found


    【解决方案1】:

    我有同样的错误。解决方案是为 sklearn 创建一个钩子。 一般来说,你需要像这样创建一个钩子文件

    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') 
    

    保存后我用下面的命令运行

    pyinstaller --additional-hooks-dir=。我的文件.py

    为了更好地理解,请关注this link

    【讨论】:

    • 对于 pyinstaller 3,您必须使用以下代码导入 collect_submodulesfrom PyInstaller.utils.hooks import collect_submodulesPyInstaller Documentation
    • 你拯救了我的一天谢谢
    • 请注意,这个 hookutils 名称已更改为 hooks:github.com/pyinstaller/pyinstaller/issues/1585
    • 你可以在spec文件的hookspath中指定--additional-hooks-dir中使用的hooks文件目录
    【解决方案2】:

    只需在要转换为exe文件的脚本中导入以下包

     import xgboost
     import sklearn.ensemble
     import sklearn.tree
     import pickle
     import pandas as pd
     import sklearn.neighbors.typedefs
     import sklearn.neighbors.quad_tree
     import sklearn.tree._utils
     import cython
     import sklearn
     import sklearn.utils._cython_blas
     import numpy as np
     import joblib
     from sklearn.preprocessing import StandardScaler
    

    这有助于我解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2021-11-25
      相关资源
      最近更新 更多