你如何解决未找到的隐藏进口商品?' pyinstaller中警告scipy?

时间:2018-03-29 15:23:50

标签: python pandas scipy scikit-learn pyinstaller

我正在使用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钩子,我能够通过在pyinstaller hooks目录中添加一个钩子来解决pandas错误。我为sklearn和scipy添加了类似的钩子,看起来它们正在运行,但是在pyinstaller输出中,我收到警告“隐藏导入" sklearn.utils.sparsetools._graph_validation&#34 ;没找到!'类似于' ._ 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 个答案:

答案 0 :(得分: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创建了一个文件。

然后它应该工作:

enter image description here