我正在使用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!'警告?-LMLPHP

关于python - 如何在pyinstaller中解决scipy的 'hidden imports not found!'警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49559770/

10-16 03:07