我正在使用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 Hook ,并且可以通过将 Hook 添加到pyinstaller Hook 目录中来解决pandas错误。我为sklearn添加了类似的钩子(Hook),使scipy看起来好像它们正在运行,但是在pyinstaller输出中,我收到警告,提示“找不到隐藏的导入“sklearn.utils.sparsetools._graph_validation”!”和类似的“._graph_tools”。
这是scipy的钩子(Hook)(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。
任何帮助表示赞赏!
最佳答案
您需要进入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
创建了一个文件。然后它应该工作:
关于python - 如何在pyinstaller中解决scipy的 'hidden imports not found!'警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49559770/