我正在使用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。
感谢任何帮助!
答案 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
创建了一个文件。
然后它应该工作: