python文件打包無法導入ultralytics模塊

💥打包的 `.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_metadatadatas += 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 ostorch_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.pswp.cn/pingmian/76509.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76509.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76509.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【React框架】什么是 Vite?如何使用vite自動生成react的目錄?

什么是 Vite? Vite 是一個基于原生 ES Modules 開發的前端構建工具,由 Evan You(Vue 的作者)開發。它最大的特點包括: 極速冷啟動:因為利用了瀏覽器原生的 ES Modules,所以在開發時無需等待整…

深入解讀 React 純組件(PureComponent)

什么是純組件? React 的純組件(PureComponent)是 React.Component 的一個變體,它通過淺比較(shallow comparison)props 和 state 來自動實現 shouldComponentUpdate() 方法,從而優化性能。 核心特點 1. 自動淺比較: PureCompon…

JavaScript數組方法:`some()`的全面解析與應用

文章目錄 JavaScript數組方法:some()的全面解析與應用一、some()方法的基本概念語法參數說明返回值 二、some()方法的核心特點三、基礎用法示例示例1:檢查數組中是否有大于10的元素示例2:檢查字符串數組中是否包含特定子串 四、實際應用場景1…

判斷兩個 IP 地址是否在同一子網 C

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> // 將點分十進制的 IP 地址轉換為 32 位無符號整數 unsigned int ip_to_uint(const char *ip) { struct in_addr addr; if (inet_pton(AF_INET, ip, &am…

React 組件樣式

在這里插入圖片描述 分為行內和css文件控制 行內 通過CSS中類名文件控制

尚硅谷Java第 4、5 章IDEA,數組

第 4 章&#xff1a;IDEA的使用 第 5 章&#xff1a;數組 5.1 數組的概述 數組(Array)&#xff1a;就可以理解為多個數據的組合。 程序中的容器&#xff1a;數組、集合框架&#xff08;List、Set、Map&#xff09;。 數組中的概念&#xff1a; 數組名 下標&#xff08;或索…

SQL注入基本原理靶場實現

? 一、前言 SQL注入漏洞(SQL injection)是WEB層面高危的漏洞之一&#xff0c;也是常見的攻擊方式。 二、本質 1、什么是SQL注入 SQL 注入是一種利用應用程序對用戶輸入數據過濾不嚴格&#xff0c;將惡意 SQL 代碼插入到正常 SQL 語句中&#xff0c;從而操控數據庫查詢邏輯的…

圖像預處理(OpenCV)

1 圖像翻轉(圖像鏡像旋轉) 在OpenCV中&#xff0c;圖片的鏡像旋轉是以圖像的中心為原點進行鏡像翻轉的。 cv2.flip(img,flipcode) 參數 img: 要翻轉的圖像 flipcode: 指定翻轉類型的標志 flipcode0: 垂直翻轉&#xff0c;圖片像素點沿x軸翻轉 flipcode>0: 水平翻轉&…

PCDN收益高低的關鍵因素

PCDN&#xff08;P2P內容分發網絡&#xff09;收益好的三個主要關鍵因素是&#xff1a;硬件配置與性能、網絡環境與質量、業務調度與策略。 1. 硬件配置與性能 設備穩定性與兼容性 PCDN節點需長時間穩定運行&#xff0c;硬件性能直接影響收益。例如&#xff0c;使用高性能CPU、…

『生成內容溯源系統』詳解

生成內容溯源系統詳解 1. 定義與核心目標 生成內容溯源系統&#xff08;Generative Content Provenance System&#xff09;是指能夠追蹤AI生成內容的來源、生成過程、版權歸屬及修改歷史的技術體系。其核心目標是&#xff1a; 驗證真實性&#xff1a;證明內容由特定AI模型生…

conda如何安裝和運行jupyter

在Conda環境中安裝和運行Jupyter Notebook是一項常見且實用的任務&#xff0c;特別是在數據科學和機器學習項目中。以下是使用Conda安裝和運行Jupyter Notebook的步驟&#xff1a; 安裝Jupyter Notebook 首先&#xff0c;確保你的Conda是最新的。打開終端或Anaconda Prompt&a…

QML之Flickable(滾動區域)

Flickable 是 QML 中用于創建可滾動區域的基礎組件&#xff0c;它比 ScrollView 提供更底層的控制&#xff0c;適合需要自定義滾動行為的場景。 基本用法 qml import QtQuick 2.15Flickable {width: 200height: 200contentWidth: 400 // 內容總寬度contentHeight: 800 // 內…

【NumPy科學計算引擎:從基礎操作到高性能實踐】

目錄 前言&#xff1a;技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析關鍵技術模塊說明技術選型對比 二、實戰演示環境配置核心代碼實現運行結果驗證 三、性能對比測試方法論量化數據對比結果分析 四、最佳實踐推薦方案 ?常見錯誤 ?調試技巧 五、應用…

PandaGPT實戰(1): 環境配置及效果演示

文章目錄 1. 環境安裝2. 數據準備2.1 模型權重獲取2.2 訓練數據準備3. 效果演示3.1 訓練3.2 部署效果PandaGPT是首個無需顯式監督即能跨六種模態執行指令微調任務的基礎模型。它展現出多樣化的多模態能力,包括復雜理解/推理、基于知識的描述以及多輪對話交互。 作為通用型指令…

spring security oauth2.0 使用GitHub

在 Spring Security 中集成 GitHub 的 OAuth 2.0 登錄&#xff0c;可以實現用戶通過 GitHub 賬號快速認證。以下是完整的分步實現指南和代碼示例&#xff1a; 一、前置準備 1. 在 GitHub 注冊 OAuth 應用 訪問 GitHub Settings → Developer settings → OAuth Apps點擊 New …

QT聊天項目DAY01

1.新建初始項目 2.修改UI格式 運行效果 3.創建登錄界面 設計登錄界面UI 設計布局 調整布局間距 往水平布局中拖入標簽和文本輸入框 更換控件名稱并固定高度 添加窗口部件 往現有的資源文件中導入圖片 添加水平布局 4.設置登陸界面為主窗口的核心組件 #pragma once#include &l…

檢測到目標URL存在http host頭攻擊漏洞

漏洞描述 修復措施 方法一&#xff1a; nginx 的 default_server 指令可以定義默認的 server 去處理一些沒有匹配到 server_name 的請求&#xff0c;如果沒有顯式定義&#xff0c;則會選取第一個定義的 server 作為 default_server。 server { …

小甲魚第004講:變量和字符串(下)| 課后測試題及答案

問答題: 0. 請問下面代碼有沒有毛病&#xff0c;為什么? 請問下面代碼為什么會出錯&#xff0c;應該如何解決&#xff1f; 答:這是由于在字符串中&#xff0c;反斜杠()會與其隨后的字符共同構成轉義字符。 為了避免這種不測情況的發生&#xff0c;我們可以在字符串的引號前面…

Hyprnote開源程序是一款記錄和轉錄您會議的 AI 記事本。 本地優先且可擴展 。

一、軟件介紹 文末提供源碼下載學習 Hyprnote開源程序是一款記錄和轉錄您會議的 AI 記事本。 從您的原始會議記錄中生成強大的摘要&#xff0c;本地優先且可擴展 。使用開源模型 &#xff08;Whisper & Llama&#xff09; 離線工作&#xff0c;高度可擴展 &#xff0c;由插…

FreeRTOS使任務處于阻塞態的API

在FreeRTOS中&#xff0c;任務進入阻塞狀態通常是因為等待某個事件或資源。以下是常用的使任務進入阻塞態的API及其分類&#xff1a; 1. 任務延時 vTaskDelay(pdMS_TO_TICKS(ms)) 將任務阻塞固定時間&#xff08;相對延時&#xff0c;從調用時開始計算&#xff09;。 示例&…