Pyinstaller; ModuleNotFoundError:没有名为“ sklearn.utils._cython_blas”的模块

ami*_*adi 1 python pyinstaller scikit-learn

我的python项目有以下导入列表:

import pandas as pd
import time
import sqlalchemy
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from sqlalchemy import Column, String, Float, Integer, SmallInteger, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Run Code Online (Sandbox Code Playgroud)

以及用于分发项目的此规范文件:

import sys
sys.setrecursionlimit(5000)

block_cipher = None


a = Analysis(['DataManager.py'],
             pathex=['E:\\ForexPredictor'],
             binaries=[],
             datas=[],
             hiddenimports=['cython','pymysql','pandas._libs.tslibs.timedeltas','sklearn.neighbors.typedefs','sklearn.utils.typedefs'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='DataManager',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='DataManager')
Run Code Online (Sandbox Code Playgroud)

我使用此命令制作项目的exe文件:

pyinstaller Datamanager.spec
Run Code Online (Sandbox Code Playgroud)

但是当我运行exe文件时,出现此错误:

ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'
Run Code Online (Sandbox Code Playgroud)

我应该在隐藏的导入部分中添加什么其他内容?

M. *_* R. 5

PyInstaller 对每个Python模块都使用了钩子机制,但是有时它会丢失一些内部软件包,因此您需要手动提供它们。您可以使用--hidden-import添加sklearn缺少的模块。

pyinstaller -F --hidden-import="sklearn.utils._cython_blas" --hidden-import="sklearn.neighbors.typedefs" --hidden-import="sklearn.neighbors.quad_tree" --hidden-import="sklearn.tree._utils" Datamanager.py
Run Code Online (Sandbox Code Playgroud)

  • 这是可行的,但每次构建时我只能发现一个丢失的包,然后我必须用它进行构建才能获取下一个丢失的包。难道没有办法一次了解所有这些吗? (7认同)

Noa*_*oah 5

添加

import sklearn.utils._cython_blas
Run Code Online (Sandbox Code Playgroud)

有可能

import sklearn.neighbors.typedefs
import sklearn.neighbors.quad_tree
import sklearn.tree
import sklearn.tree._utils
Run Code Online (Sandbox Code Playgroud)

到你的代码。


小智 5

我还没有尝试过,但认为你可以通过添加来解决这个问题: --collect-submodules "sklearn"

我使用的是“Auto py to exe”,它在内部使用 pyinstaller 并解决了修改该参数的问题。

如果你还使用“Auto py to exe”这里有两种方法可以解决这个问题。

  1. (这个解释了问题是什么)首先运行安装程序,而不选择“一个文件”选项(选择一个目录)。该过程完成后,打开包含的文件夹。在那里你会找到 sklearn 文件夹,该文件夹尚未被 pyinstaller 完全复制。因此,解决问题的方法是将此文件夹替换为“C:\PythonXY\Lib\site-packages”中具有相同名称“sklearn”的文件夹。之后exe文件就可以正常运行了。

  2. (我更喜欢这个)如果您还想使用一个文件将所有内容收集到 exe 文件中,您将无法手动替换 s​​klearn 文件夹。在这种情况下,您必须在“高级>要捆绑什么,在哪里搜索>收集子模块”中写入“sklearn”(不带“”)

  • --collect-submodules“sklearn”为我解决了这个问题。比国际海事组织接受的答案更清晰的命令 (3认同)