您如何解决“未找到隐藏的导入!” pyinstaller 中针对 scipy 的警告?

Posted

技术标签:

【中文标题】您如何解决“未找到隐藏的导入!” pyinstaller 中针对 scipy 的警告?【英文标题】:How do you resolve 'hidden imports not found!' warnings in pyinstaller for scipy? 【发布时间】:2018-09-08 15:07:15 【问题描述】:

我正在使用 pyinstaller 为使用 pandas 和 sklearn 的 python 程序创建一个 .exe。 pyinstaller 进程完成并按预期生成带有可执行文件的 dist 文件夹。但是,当我运行 .exe 时,出现与 sklearn 和 scipy 相关的模块导入错误。

我创建了一个测试脚本 (test.py) 来测试导入,它只导入 pandas 和 sklearn,然后打印成功消息:

import time
import pandas as pd
import sklearn

def main():
  print('hello world!')
  time.sleep(5)


if __name__ == '__main__':
  main()

我知道 pyinstaller hooks 并且我能够通过在 pyinstaller hooks 目录中添加一个 hooks 来解决 pandas 错误。我为 sklearn 和 scipy 添加了类似的钩子,看起来它们正在运行,但在 pyinstaller 输出中我收到警告说“找不到隐藏导入“sklearn.utils.sparsetools._graph_validation”!和'._graph_tools'类似的一个。

这是 scipy (hook-scipy.py) 的钩子:

print('loading custome hook for scipy')

from PyInstaller.utils.hooks import collect_submodules
hiddenimports = collect_submodules('scipy') 

这是运行 pyinstaller 生成的警告的快照

这是运行 test.exe 时的错误快照

我在一个安装了 pyinstaller、pandas、sklearn、scipy 和所有依赖项的虚拟环境中工作(至少我可以在这个 venv 中运行常规的 test.py 脚本)。在 Windows 10.10.0 上使用 PyInstaller 3.3.1、Python 3.6.4。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

你需要进入 hook-scipy.py(或创建一个)并让它看起来像这样:

from PyInstaller.utils.hooks import collect_submodules
from PyInstaller.utils.hooks import collect_data_files
hiddenimports = collect_submodules('scipy')

datas = collect_data_files('scipy')

然后进入 hook-sklearn.metrics.cluster.py 文件,修改如下:

from PyInstaller.utils.hooks import collect_data_files

hiddenimports = ['sklearn.utils.sparsetools._graph_validation',
                 'sklearn.utils.sparsetools._graph_tools',
                 'sklearn.utils.lgamma',
                 'sklearn.utils.weight_vector']

datas = collect_data_files('sklearn')

我不知道这部分是否必要,但我还创建了一个如下所示的 hook-sklearn.py 文件:

from PyInstaller.utils.hooks import collect_submodules
hiddenimports = collect_submodules('sklearn')

在cmd中我使用pyinstaller test.py -F创建了一个文件。

那么它应该可以工作了:

【讨论】:

感谢您的回复克里斯。我检查了 hooks 文件夹,并且 hooks 目录中已经有一个名为 hook-sklearn.metrics.cluster.py 的文件:# Tested on Windows 7 64bit with scikit-learn 0.17 and Python 2.7 hiddenimports = ['sklearn.utils.sparsetools._graph_validation', 'sklearn.utils.sparsetools._graph_tools', 'sklearn.utils.lgamma', 'sklearn.utils.weight_vector']' 我还在这个钩子中添加了一个打印语句,它验证它是否被调用。它现在直接出现在警告之前。 成功了!我确实为您上面提到的那些文件准备了挂钩文件,但问题是我只有 hiddenimports 语句。一旦我包含了“数据”行,它就会按照您的大纲工作。我还会提到我在 onedir 模式下运行 pyinstaller,但我也会在单文件模式下尝试它。编辑:即使它有效,我仍然会收到上面显示的警告-我猜它们只是警告而不是错误?非常感谢您的帮助! @LukeWalsh 我很确定 hook-sklearn.py 文件中的 Warning Hidden import ... not found 是满意的。我很高兴它对你有用。如果您遇到任何其他问题,请告诉我。 hooks 文件夹在哪里?我不确定将这些文件放在哪里。谢谢。 @schrodingerscat11 在 Windows 上使用 Anaconda:C:\Users\user_name\AppData\Local\Programs\Python\Python38\Lib\site-packages\PyInstaller\hooks 或在 Mac 上:/Users/user_name/opt/anaconda3/pkgs/pyinstaller-3.6-py38ha441bb4_5/lib/python3.8/site-packages/PyInstaller/hooks,但您需要确保版本正确。可能最容易在您的计算机上搜索pyinstaller 文件夹。

以上是关于您如何解决“未找到隐藏的导入!” pyinstaller 中针对 scipy 的警告?的主要内容,如果未能解决你的问题,请参考以下文章

发生 Pyinstaller 模块未找到错误。如何解决?

如何解决 Pyinstaller 模块未找到错误

用pyinstaller打包生成的文件,一旦更改图标大小就会恢复默认图标,如何解决。

Python PyQt5如何更改最小化图标

如何解决意外的 pyinstaller 异常“找不到 pyqt5_plugins 分发”?

mac打包python + pyinstaller,解决相对路径问题