您如何解决“未找到隐藏的导入!” 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打包生成的文件,一旦更改图标大小就会恢复默认图标,如何解决。