python文件打包无法导入ultralytics模块

news2025/4/15 6:02:32

💥打包的 `.exe` 闪退了?别慌!教你逐步排查 PyInstaller 打包的所有错误!

    • 🛠 运行 `.exe` 查看报错信息
      • ✅ 正确姿势:
    • ⚠ importlib 动态导入导致打包失败
      • ❓什么是动态导入?
      • ✅ 解决方式:
    • 📦 包元数据丢失问题:`importlib.metadata.PackageNotFoundError`
      • 🎯 根本原因:
      • ✅ 解决方法一:打包命令添加参数
      • ✅ 解决方法二:使用 `.spec` 文件方式
    • ❌ DLL 加载失败:WinError 127
      • ✅ 修复步骤:
        • ✅ 第一步:找到 torch 的 lib 路径
        • ✅ 第二步:修改 `.spec` 文件
    • 🔧 终极解决方案:用 `PyInstaller.__main__` 写一个自定义 `package.py`
      • ✅ 优点:
    • 🔚 总结
    • 🧠 附:打包常见库建议参数

前面的只是学习,虽然问题解决了,但是一个个问题又冒出来了,可以直接看最后一部分,我换了一个方法。

🛠 运行 .exe 查看报错信息

很多人在直接双击 .exe 文件时,会发现它“一闪而过”就没了。这是因为程序崩溃了,报错信息来不及显示。

✅ 正确姿势:

  1. 打开终端(CMD 或 PowerShell)
  2. 切换到 .exe 文件所在目录
  3. 运行:
cd dist\your_program
.\your_program.exe

如图所示:

运行exe看报错


⚠ importlib 动态导入导致打包失败

❓什么是动态导入?

很多库使用 importlib.import_module("模块名") 来动态加载模块,而不是传统的 import 模块名

PyInstaller 只能分析静态导入,遇到动态导入时,它就不知该打包啥了,运行就会提示模块缺失或功能失效。

✅ 解决方式:

spec 文件的 datas 中手动添加:

datas = [
    (r"G:\anaconda\envs\pcb\Lib\site-packages\ultralytics", "ultralytics"),
]

重新打包即可。


📦 包元数据丢失问题:importlib.metadata.PackageNotFoundError

报错信息:

importlib.metadata.PackageNotFoundError: No package metadata was found for torchvision

🎯 根本原因:

PyInstaller 默认不会打包 metadata,而有些库(如 ultralytics)使用:

importlib.metadata.version("torchvision")

来获取依赖库的版本,因此需要明确告诉它:把 metadata 一起带上!

✅ 解决方法一:打包命令添加参数

pyinstaller --onefile ^
  --collect-all ultralytics ^
  --copy-metadata=torch ^
  --copy-metadata=torchvision ^
  --copy-metadata=ultralytics ^
  main_window.py

✅ 解决方法二:使用 .spec 文件方式

.spec 中添加:

from PyInstaller.utils.hooks import copy_metadata

datas += copy_metadata('torch')
datas += copy_metadata('torchvision')
datas += copy_metadata('ultralytics')

❌ DLL 加载失败:WinError 127

错误提示:

OSError: [WinError 127] 找不到指定模块
Error loading "torch\lib\caffe2_detectron_ops.dll"

说明 PyInstaller 没把某些 .dll 一起打包!

✅ 修复步骤:

✅ 第一步:找到 torch 的 lib 路径

运行:

python -c "import torch; print(torch.__path__)"

假设路径为:

G:\anaconda\envs\pcb\Lib\site-packages\torch
✅ 第二步:修改 .spec 文件
import glob
import os

torch_dlls = [
    (f, os.path.join('torch', 'lib')) for f in glob.glob(
        r'G:\anaconda\envs\pcb\Lib\site-packages\torch\lib\*.dll'
    )
]

a = Analysis(
    ['main_window.py'],
    ...
    binaries=torch_dlls,
    datas=[
        (r"G:\anaconda\envs\pcb\Lib\site-packages\ultralytics", "ultralytics"),
        (r"G:\anaconda\envs\pcb\Lib\site-packages\torch", "torch"),
        (r"G:\anaconda\envs\pcb\Lib\site-packages\torchvision", "torchvision"),
    ],
    ...
)

🔧 终极解决方案:用 PyInstaller.__main__ 写一个自定义 package.py

上面的方法,始终有问题。耽误了我一天的时间,最终终于找到了解决的方案。换了一种方法。
import PyInstaller.main
你可以自己写一个 package.py 脚本统一管理打包逻辑:

import PyInstaller.__main__

PyInstaller.__main__.run([
    '--onefile',
    '--nowindowed',
    '-n', 'defect_detect',
    '-i', 'ui/ui_imgs/icons/目标检测.ico',
    '--add-data=ui/ui_imgs/icons;ui/ui_imgs/icons',
    '--add-data=view/style.css;view',
    '--copy-metadata=torch',
    '--copy-metadata=torchvision',
    '--copy-metadata=ultralytics',
    '--collect-all', 'ultralytics',
    'main_window.py',
])

✅ 优点:

  • 不再需要手动修改 .spec
  • 自动包含 metadata
  • 可重复运行,一键打包!

🔚 总结

错误类型解决方案
exe 闪退命令行运行查看报错
动态导入库找不到datas手动添加路径
metadata 丢失添加 --copy-metadata 参数
DLL 加载失败torch/lib/*.dll 添加进 binaries
打包太麻烦用 PyInstaller API 脚本自动化

🧠 附:打包常见库建议参数

库名称打包建议
ultralytics--collect-all ultralytics
torch--copy-metadata=torch + 添加 dll
torchvision--copy-metadata=torchvision
numpy一般自动打包
matplotlib建议 --collect-submodules

如果你觉得本篇文章对你有帮助,欢迎点赞、收藏、转发!🚀
更多 PyInstaller 技术细节、实战案例持续更新中~
有任何问题也欢迎评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AMBA-CHI协议详解(二十六)

AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transactions AMBA-CHI协议详解(五)- Transaction identifier fields AMBA-CHI协议详解(六…

Go小技巧易错点100例(二十六)

本期分享: 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文: string转[]byte是否会发生内存拷贝 在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字…

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …

ubuntu20.04+qt5.12.8安装serialbus

先从官网https://download.qt.io/archive/qt/5.12/5.12.8/submodules/ 下载 qtserialbus-everywhere-src-5.12.8.tar.xz 有需要其他版本的点击返回上一级自行寻找对应版本。 也可从 https://download.csdn.net/download/zhouhui1982/90595810 下载 在终端中依次输入以下命令…

如何查看自己抖音的IP属地?详细教程+常见问题解答

在当今互联网时代,IP属地信息已成为各大社交平台(如抖音、微博、快手等)展示用户真实网络位置的重要功能。无论是出于隐私保护、账号安全,还是单纯好奇自己的IP归属地,了解如何查看抖音IP属地都很有必要。 本文将详细介…

⑪数据中心网络M-LAG实战

一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…

化工企业数字化转型:从数据贯通到生态重构的实践路径

一、战略定位:破解行业核心痛点 化工行业面临生产安全风险高(全国危化品企业事故率年增5%)、能耗与排放压力大(占工业总能耗12%)、供应链协同低效(库存周转率低于制造业均值30%)三大挑战。《石…

JAVA——初识JAVA

文章目录 如何在cmd上编译、运行代码解析String[] args中放的是什么Java结构编译运行可能遇到的错误Java中的注释Java的三种注释编码不一致的问题 IDEA常用基础开发快捷键补齐快捷键注释快捷键 IDEA的基础调式方法标识符 如何在cmd上编译、运行 在没有集成开发环境下&#xff…

Shell脚本的学习

编写脚本文件 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释,否则使用默认shel 第一步:编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步:加上执行权限:chmod x 脚本文件名.sh 第三步&…

专题十四:动态路由——OSPF

一、OSPF简介 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol),采用DIjkstra算法,协议号是89。用于自治系统(A…

Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像

引擎:3.8.5 您好,我是鹤九日! 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味,让很多人选择了放弃。然而不得不说:任何新知识、新领域的学习,本身面临的都是问题! 互联网和AI给了我…

【AI论文】VCR-Bench:视频链式思考推理的综合评估框架

摘要:思想链(CoT)推理的进步显著增强了大型语言模型(LLMs)和大型视觉语言模型(LVLMs)的能力。 然而,目前仍然缺乏一个严格的视频CoT推理评估框架。 目前的视频基准测试无法充分评估推…

数据中台、BI业务访谈(二):组织架构梳理的坑

这是数据中台、BI业务访谈系列的第二篇文章,在上一篇文章中,我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后,就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) (声明:实际操作请遵守网络安全法,仅在授权环境进行测试,仅供个人研究) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件…

库学习04——numpy

一、基本属性 二、 创建数组 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话,默认是从0到n-1的一维数组。 (二)自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …

Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作

本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写,将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说,立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…

SLAM(七)-卡尔曼滤波

SLAM(七)-卡尔曼滤波 一、卡尔曼滤波(KF)二、扩展卡尔曼滤波(EKF)三、误差状态卡尔曼滤波(ESKF) 参考《概率机器人》、《Principles of GNSS,lnertial and Multisensor lntegrated Navigation Systems (Second Edition)》 一、卡尔曼滤波(KF)…

如何解决DDoS攻击问题 ?—专业解决方案深度分析

本文深入解析DDoS攻击面临的挑战与解决策略,提供了一系列防御技术和实践建议,帮助企业加强其网络安全架构,有效防御DDoS攻击。从攻击的识别、防范措施到应急响应,为网络安全工作者提供了详细的操作指引。 DDoS攻击概览&#xff1a…

Windows for Redis 后台服务运行

下载 redis 安装包 地址:https://github.com/tporadowski/redis/releases 解压zip压缩包,执行 redis-server.exe 即可以窗口模式运行(窗口关闭则服务关闭) 运行窗口可以看到,端口是 6379 我这里使用 nvaicat 客服端测…

C语言超详细指针知识(二)

在上一篇有关指针的博客中,我们介绍了指针的基础知识,如:内存与地址,解引用操作符,野指针等,今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…