cx_freeze打包Python脚本为exe后出现NP_SUPPORTED_MODULES导入错误求助
问题
在VS Code中运行以下Python脚本完全正常:
try: import os from bs4 import BeautifulSoup as bs import xlsxwriter import sys,traceback import time,threading import PySimpleGUI as sg import requests import easyocr import certifi from datetime import datetime from pymongo import MongoClient from bson.objectid import ObjectId except: sys.stderr = open('../error.log', 'a+',encoding='utf-8') traceback.print_exc() sys.stderr.close() reader = easyocr.Reader(['en']) # this needs to run only once to load the model into memory
但使用cx_freeze打包为exe文件后,运行生成的exe时出现如下ImportError:
Traceback (most recent call last): File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\osos_adanaorganize_scraper.py", line 9, in <module> import easyocr File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\easyocr\__init__.py", line 1, in <module> from .easyocr import Reader File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\easyocr\easyocr.py", line 3, in <module> from .recognition import get_recognizer, get_text File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\easyocr\recognition.py", line 6, in <module> import torchvision.transforms as transforms File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\torchvision\__init__.py", line 6, in <module> from torchvision import _meta_registrations, datasets, io, models, ops, transforms, utils File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\osos-scraper-_win_application\lib\torchvision\models\__init__.py", line 2, in <module> from .convnext import * File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\osos-scraper-_win_application\lib\torchvision\models\convnext.py", line 8, in <module> from ..ops.misc import Conv2dNormActivation, Permute File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\torchvision\ops\__init__.py", line 23, in <module> from .poolers import MultiScaleRoIAlign File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\torchvision\ops\poolers.py", line 10, in <module> from .roi_align import roi_align File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\torchvision\ops\roi_align.py", line 4, in <module> import torch._dynamo File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\torch\_dynamo\__init__.py", line 2, in <module> from . import allowed_functions, convert_frame, eval_frame, resume_execution File "D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\env\lib\site-packages\torch\_dynamo\allowed_functions.py", line 30, in <module> from .utils import hashable, is_safe_constant, NP_SUPPORTED_MODULES ImportError: cannot import name 'NP_SUPPORTED_MODULES' from 'torch._dynamo.utils' (D:\Developing\W.S-PROJECT\osos.adanaorganize.org.tr\osos-scraper-_win_application\lib\torch\_dynamo\utils.pyc)
解决方案
降级PyTorch/TorchVision到稳定版本
这个错误多因torch._dynamo模块的API变动导致,建议安装兼容性更好的稳定版本:pip install torch==2.0.1 torchvision==0.15.2 --force-reinstall安装完成后重新打包,大部分情况下能解决模块导入问题。
修改cx_freeze配置排除不必要模块
在你的setup.py中,添加排除torch._dynamo的配置,因为easyocr运行不需要该模块:from cx_Freeze import setup, Executable executables = [Executable("osos_adanaorganize_scraper.py")] setup( name="osos_scraper", version="1.0", description="Your scraper app", executables=executables, options={ "build_exe": { "excludes": ["torch._dynamo"], "include_files": [] # 可添加easyocr需要的模型文件路径 } } )注意:如果easyocr运行时需要预下载的模型,要把模型所在目录(通常在
~/.EasyOCR/model)加到include_files里。更换打包工具为PyInstaller
cx_freeze对PyTorch生态的支持不如PyInstaller完善,尝试用PyInstaller打包:- 安装PyInstaller:
pip install pyinstaller - 生成spec文件(可选,方便配置):
pyi-makespec osos_adanaorganize_scraper.py - 修改spec文件,添加easyocr模型路径和必要的排除项:
在datas中加入模型路径,比如:
然后执行打包:datas=[(r"C:\Users\YourUser\.EasyOCR\model", "model")]pyinstaller osos_adanaorganize_scraper.spec
- 安装PyInstaller:
手动补充缺失的变量定义
如果以上方法都无效,可以找到你的虚拟环境中torch/_dynamo/utils.py文件,查看是否有NP_SUPPORTED_MODULES的定义,将其复制到打包后的utils.pyc对应的文件中(需要反编译pyc文件,操作较繁琐,不推荐作为首选)。
内容的提问来源于stack exchange,提问作者Mominur Rahman
相关产品推荐
相关产品推荐

