讓 VSCode 調試器像 PyCharm 一樣顯示 Tensor Shape、變量形狀、變量長度、維度信息

文章目錄

    • 🎯 目標:在 VS Code 調試器中自動顯示這些變量信息
    • 🔍 原理簡介
      • ?? 其他方案的局限性
        • ? 方案一:重寫 `__repr__`
        • ? 方案二:向 debugpy 注冊自定義變量顯示器(StrPresentationProvider)
    • ? 我的方案優勢
    • 🛠? 具體實現步驟
      • 1. 找到 debugpy 對應的文件目錄
        • 對于 Windows 用戶
        • 對于 Ubuntu / Linux 用戶
      • 2. 修改 `get_variable_details()` 函數
    • 📊 工作流程解析
    • ?? 注意事項
    • 📚 參考文獻


你是否也有這樣的痛點:在 PyCharm 中調試深度學習模型或代碼時,變量區會清晰顯示每個變量的 shape 和類型信息,而在 VS Code 中卻只能看到一團 tensor(...)?別急,這篇文章帶你一步一步打造 VS Code 的“PyCharm 式調試體驗”。

先看 VS Code 調試效果圖

在這里插入圖片描述

🎯 目標:在 VS Code 調試器中自動顯示這些變量信息

  • ? torch.Tensor: 顯示 {Tensor: (3, 4)}
  • ? numpy.ndarray: 顯示 {ndarray: (2, 2)}
  • ? pandas.DataFrame: 顯示 {DataFrame: (5, 3)}
  • ? listdictsettuple: 顯示長度 {list: 3}{dict: 3}{set: 3}{tuple: 3}

🔍 原理簡介

VS Code 的 Python 調試器底層使用的是 debugpy,其中,變量的顯示格式由 pydevd_xml.py 中的 get_variable_details() 函數控制。通過修改該函數邏輯,我們可以為常見的數據結構注入形狀(shape)或長度(len)信息,使其直接顯示在調試面板中。

?? 其他方案的局限性

在社區中也存在一些嘗試解決此問題的方案,但大多存在以下缺陷:

? 方案一:重寫 __repr__

一種直觀的做法是通過自定義 __repr__ 方法來改變變量在調試器中的顯示方式【在 VS Code 中調試 Tensor 形狀不顯示的問題及解決方案】。這種方式可以實現變量顯示的定制化,但它 無法影響調試器中內置類型(如 boolintstr 等)的顯示行為

? 方案二:向 debugpy 注冊自定義變量顯示器(StrPresentationProvider)

另一種方法是利用 debugpy 提供的擴展機制,注冊一個 StrPresentationProvider,告訴調試器如何渲染特定類型的變量。【在 VS Code 調試器中自動顯示變量形狀和維度信息】【VS Code 中為調試器增強變量顯示:自動顯示張量 Shape、DataFrame 維度和容器長度】。這種方法雖然理論上更優雅,但在實際使用中發現,它會 讀取原始的完整變量內容 來生成字符串表示,這在面對大型數組、DataFrame 或嵌套結構時會導致 嚴重卡頓甚至崩潰,嚴重影響調試體驗。

? 我的方案優勢

我選擇從 debugpy 內部機制入手,通過修改其源碼中的 get_variable_details() 函數,在變量渲染階段注入形狀信息,從而避免了上述方法的性能問題和副作用。

這一改動僅作用于調試器前端顯示層,不會影響程序運行邏輯,也不會因變量過大而造成性能瓶頸。

而且,debugpy 在內部已經對變量內容做了優化處理,只讀取必要的元數據(如 shape、dtype、len)而不加載整個對象內容,因此能保持幾乎與原始 VS Code 調試器相同的響應速度。


🛠? 具體實現步驟

1. 找到 debugpy 對應的文件目錄

根據你使用的編輯器和操作系統,找到對應的文件目錄:

對于 Windows 用戶

如果你使用的是 VS Code 或基于 VS Code 內核的編輯器(例如 Cursor),則路徑通常如下:

  • VS Code:
C:\Users\Tang\.vscode\extensions\ms-python.debugpy-2025.10.0-win32-x64\bundled\libs\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_xml.py
  • Cursor:
C:\Users\Tang\.cursor\extensions\ms-python.debugpy-2025.8.0-win32-x64\bundled\libs\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_xml.py

💡 注意:實際路徑可能會有所不同,請根據實際情況調整。

對于 Ubuntu / Linux 用戶

如果你使用的是 Ubuntu 或其他 Linux 發行版,路徑通常如下:

  • VS Code:
~/.vscode-server/extensions/ms-python.debugpy-2025.10.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py
  • Cursor:
~/.cursor-server/extensions/ms-python.debugpy-2025.6.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_xml.py

💡 注意:我寫的是遠程 remote-ssh 的服務器路徑,本地路徑可能會有所不同比如.cursor-server換成.cursor等,請根據實際情況調整。


2. 修改 get_variable_details() 函數

修改之前做好備份

打開 pydevd_xml.py 文件,找到get_variable_details()函數,完整修改之后如下:

def get_variable_details(val, evaluate_full_value=True, to_string=None, context: Optional[str] = None):""":param context:This is the context in which the variable is being requested. Valid values:"watch","repl","hover","clipboard""""try:# This should be faster than isinstance (but we have to protect against not having a '__class__' attribute).is_exception_on_eval = val.__class__ == ExceptionOnEvaluateexcept:is_exception_on_eval = Falseif is_exception_on_eval:v = val.resultelse:v = val_type, type_name, resolver = get_type(v)type_qualifier = getattr(_type, "__module__", "")if not evaluate_full_value:value = DEFAULT_VALUEelse:try:# 添加形狀信息shape_info = ""try:# 處理 PyTorch Tensorif type_qualifier == "torch" and hasattr_checked(v, 'shape') and hasattr_checked(v, 'dtype'):shape = tuple(v.shape)dtype = str(v.dtype)shape_info = f"{{Tensor: {shape}}} "# 處理 NumPy ndarrayelif type_qualifier == "numpy" and hasattr_checked(v, 'shape') and hasattr_checked(v, 'dtype'):shape = tuple(v.shape)dtype = str(v.dtype)shape_info = f"{{ndarray: {shape}}} "# 處理 Pandas DataFrameelif type_qualifier == "pandas.core.frame" and hasattr_checked(v, 'shape'):shape = tuple(v.shape)shape_info = f"{{DataFrame: {shape}}} "# 處理 Pandas Serieselif type_qualifier == "pandas.core.series" and hasattr_checked(v, 'shape'):shape = tuple(v.shape)dtype = str(v.dtype)shape_info = f"{{Series: {shape}}} "# 處理其他有 shape 屬性的對象elif hasattr_checked(v, 'shape'):shape_info = f"{{{v.shape}}} "# 處理可計數對象elif hasattr_checked(v, '__len__'):try:length = len(v)shape_info = f"{{{type_name}: {length}}} "except:passexcept:passstr_from_provider = _str_from_providers(v, _type, type_name, context)if str_from_provider is not None:value = shape_info + str_from_providerelif to_string is not None:value = shape_info + to_string(v)elif hasattr_checked(v, "__class__"):if v.__class__ == frame_type:value = pydevd_resolver.frameResolver.get_frame_name(v)elif v.__class__ in (list, tuple):if len(v) > 300:value = "%s: %s" % (str(v.__class__), "<Too big to print. Len: %s>" % (len(v),))else:value = "%s: %s" % (str(v.__class__), v)else:try:cName = str(v.__class__)if cName.find(".") != -1:cName = cName.split(".")[-1]elif cName.find("'") != -1:  # does not have '.' (could be something like <type 'int'>)cName = cName[cName.index("'") + 1 :]if cName.endswith("'>"):cName = cName[:-2]except:cName = str(v.__class__)value = "%s: %s" % (cName, v)else:value = shape_info + str(v)except:try:value = repr(v)except:value = "Unable to get repr for %s" % v.__class__# fix to work with unicode valuestry:if value.__class__ == bytes:value = value.decode("utf-8", "replace")except TypeError:passreturn type_name, type_qualifier, is_exception_on_eval, resolver, value

具體來說,在 get_variable_details() 函數中添加了1處內容,并修改了3處內容,具體如下:

  1. 添加了1處內容。
    找到if not evaluate_full_value:這個地方,進行下面的添加:
if not evaluate_full_value:value = DEFAULT_VALUE
else:try:# 添加形狀信息shape_info = ""try:# 處理 PyTorch Tensorif type_qualifier == "torch" and hasattr_checked(v, 'shape') and hasattr_checked(v, 'dtype'):shape = tuple(v.shape)dtype = str(v.dtype)shape_info = f"{{Tensor: {shape}}} "# 處理 NumPy ndarrayelif type_qualifier == "numpy" and hasattr_checked(v, 'shape') and hasattr_checked(v, 'dtype'):shape = tuple(v.shape)dtype = str(v.dtype)shape_info = f"{{ndarray: {shape}}} "# 處理 Pandas DataFrameelif type_qualifier == "pandas.core.frame" and hasattr_checked(v, 'shape'):shape = tuple(v.shape)shape_info = f"{{DataFrame: {shape}}} "# 處理 Pandas Serieselif type_qualifier == "pandas.core.series" and hasattr_checked(v, 'shape'):shape = tuple(v.shape)dtype = str(v.dtype)shape_info = f"{{Series: {shape}}} "# 處理其他有 shape 屬性的對象elif hasattr_checked(v, 'shape'):shape_info = f"{{{v.shape}}} "# 處理可計數對象elif hasattr_checked(v, '__len__'):try:length = len(v)shape_info = f"{{{type_name}: {length}}} "except:passexcept:pass
  1. 然后在構建最終顯示值時,將 shape_info 插入前面,共3處:

value = str_from_provider修改如下:

value = shape_info + str_from_provider

value = to_string(v)修改如下:

value = shape_info + to_string(v)

value = str(v)修改如下:

value = shape_info + str(v)

📊 工作流程解析

當我們在 VS Code 中啟動調試會話時,整個流程如下:

  1. VS Code 啟動調試器并加載內置的 debugpy 模塊。
  2. debugpy 連接到目標 Python 程序并開始監聽斷點。
  3. 當程序暫停時,debugpy 收集當前作用域內的變量信息。
  4. 在變量渲染階段,調用 get_variable_details() 函數生成顯示字符串。
  5. 我們的修改在此處注入形狀信息。
  6. 最終結果返回給 VS Code 前端展示。

需要注意的是,VS Code 優先使用其自帶的 debugpy,而不是環境中的 pip 安裝版本。因此,我們的修改需針對 VS Code 擴展目錄中的源文件。


?? 注意事項

  1. VS Code 更新覆蓋修改:每次更新 VS Code 或 Python 擴展后,可能需要重新應用修改。
  2. 備份原始文件:修改前務必備份原文件,以便恢復或對比。

📚 參考文獻

  1. 在 VS Code 中調試 Tensor 形狀不顯示的問題及解決方案
  2. VS Code 中為調試器增強變量顯示:自動顯示張量 Shape、DataFrame 維度和容器長度
  3. 在 VS Code 調試器中自動顯示變量形狀和維度信息

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88667.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88667.shtml

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

相關文章

pip國內鏡像源一覽

以下是2025年主流pip國內鏡像源完整清單及配置指南&#xff0c;綜合多個權威來源整理的最新數據&#xff1a;一、核心鏡像源推薦&#xff08;2025年穩定可用&#xff09;?阿里云鏡像?https://mirrors.aliyun.com/pypi/simple/優勢&#xff1a;依托阿里云CDN&#xff0c;全國平…

當大模型遇見毫米波:用Wi-Fi信號做“透視”的室內語義SLAM實踐——從CSI到神經輻射場的端到端開源方案

作者 | Blossom.118 2025-07-12 關鍵詞&#xff1a;CSI-SLAM、神經輻射場、毫米波、Transformer、數字孿生、開源 ---- 1. 為什么要“無攝像頭”語義SLAM&#xff1f; ? 隱私紅線&#xff1a;歐盟GDPR 2024修訂版把“攝像頭點云”列入高風險生物特征&#xff0c;落地成本高。…

脈沖神經網絡膜電位泄漏系數學習:開啟時空動態特征提取的新篇章

脈沖神經網絡膜電位泄漏系數學習&#xff1a;開啟時空動態特征提取的新篇章 摘要 脈沖神經網絡&#xff08;Spiking Neural Networks, SNNs&#xff09;作為第三代神經網絡模型&#xff0c;憑借其事件驅動、高生物逼真度和潛在的超低功耗特性&#xff0c;已成為類腦計算與高效人…

SSRF(ctfshow)

web351-358這部分的題目都是明文的&#xff0c;按照題目要求繞過就行了<?php error_reporting(0); highlight_file(__FILE__); $url$_POST[url]; $xparse_url($url); if($x[scheme]http||$x[scheme]https){ if(!preg_match(/localhost|127\.0\.|\。/i, $url)){ $chcurl_ini…

亞矩陣云手機:重構物流供應鏈,讓跨境包裹“飛”得更快更準

在跨境電商“時效即生命”的競爭中&#xff0c;物流信息滯后、清關效率低下、成本居高不下已成為商家最頭疼的“三座大山”。傳統模式下&#xff0c;人工更新物流狀態耗時易錯&#xff0c;跨境包裹常因清關延誤遭客戶投訴&#xff0c;而高昂的物流成本更直接吞噬利潤。亞矩陣云…

HTML(5) 代碼規范

HTML(5) 代碼規范 引言 HTML(HyperText Markup Language)是一種用于創建網頁的標準標記語言。HTML5 作為最新的 HTML 標準,自 2014 年正式發布以來,已經成為了構建現代網頁應用的基礎。本文將詳細介紹 HTML5 代碼規范,包括結構、語法、屬性以及最佳實踐等內容,旨在幫助…

【PTA數據結構 | C語言版】順序棧的3個操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n1 個整數順序壓入容量為 n 的棧&#xff0c;隨后執行 n1 次取頂并出棧的操作。 輸入格式&#xff1a; 輸入首先在第一行給出正整數 n&#xff08;≤10^4 &#xff09;&a…

使用Pycharm集成開發工具遠程調試部署在虛擬機上的flask項目:超級詳細的完整指南

本文將詳細介紹如何通過PyCharm Professional版遠程調試部署在虛擬機(這里以Ubuntu為例)中的Flask項目。這種開發方式特別適合需要在接近生產環境調試的場景。 虛擬機網絡配置 這里用到的是VMware的NAT&#xff0c;即網絡地址轉換模式&#xff0c;要保證你Linux虛擬機的IP&…

UE制作的 AI 交互數字人嵌入到 Vue 開發的信息系統中的方法和步驟

要將 UE(Unreal Engine,虛幻引擎)制作的 AI 交互數字人嵌入到 Vue 開發的信息系統首頁中運行,可以參考以下方法步驟以及涉及的軟件工具: 準備工作 軟件工具 Unreal Engine:用于創建和編輯 AI 交互數字人,需要在 UE 中完成數字人的建模、綁定骨骼、添加 AI 交互邏輯等工…

基于elementUI的el-autocomplete組件的自動補全下拉框實踐

<template><div :class"$options.name"><el-autocompletestyle"width: 100%"ref"autocomplete":popper-class"${$options.name}-el-autocomplete"v-model"inputSearchValue":placeholder"輸入關鍵詞...…

Gameplay - 獨立游戲Celeste的Player源碼

TGA2018最佳獨立游戲《蔚藍》的一些公開代碼&#xff1b;主要是Player部分的代碼&#xff1a;using System; using System.Collections; using System.Collections.Generic; using Monocle; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input;namespace Cel…

基于大模型的鼻咽癌全周期預測及診療優化研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 國內外研究現狀 1.3 研究目標與創新點 二、大模型技術與鼻咽癌相關理論基礎 2.1 大模型技術概述 2.2 鼻咽癌疾病知識 2.3 大模型在醫學領域的應用 三、數據收集與預處理 3.1 數據來源 3.2 數據清洗 3.3 數據標注 3.4 數據標…

基于odoo17的設計模式詳解---訪問模式

大家好&#xff0c;我是你的Odoo技術伙伴。想象一下&#xff0c;我們有一個復雜的對象結構&#xff0c;比如一個由不同類型的訂單行&#xff08;銷售行、折扣行、備注行&#xff09;組成的銷售訂單。現在&#xff0c;我們需要對這個結構執行一些新的操作&#xff0c;比如&#…

使用langgraph 構建RAG 智能問答代理

RAG 智能問答代理&#xff1a; ? 支持用戶持續提問 ? 根據模型判斷是否需要查資料 ? 自動調用 PDF 檢索工具查找內容 ? 自動引用內容回答 ? 可以輸入 exit / quit 退出 下載需要的library pip install langchain-google-genai pip install langgraph pip install langchai…

零基礎搭建監控系統:Grafana+InfluxDB 保姆級教程,5分鐘可視化服務器性能!?

??你是否遇到過這些問題&#xff1f;??服務器突然卡頓&#xff0c;卻找不到性能瓶頸需要手動查看日志&#xff0c;無法實時監控數據運維報表全靠截圖拼接&#xff0c;領導直呼“太原始”?今天教你用GrafanaInfluxDB構建企業級監控系統&#xff0c;從此告別“盲人摸象”式運…

Java中的wait和notify、Condition接口的使用

Java中的wait和notify機制基礎概念在Java中&#xff0c;wait()和notify()是Object類的原生方法&#xff0c;用于實現線程間的協作&#xff1a;wait()使當前線程釋放對象鎖并進入等待狀態必須在synchronized代碼塊內調用語法&#xff1a;obj.wait() 或 obj.wait(long timeout)線…

【Modern C++ Part9】Prefer-alias-declarations-to-typedefs

條款9&#xff1a;優先使用聲明別名而不是typedef 我有信心說&#xff0c;大家都同意使用STL容器是個好的想法&#xff0c;并且我希望&#xff0c;條款18可以說服你使用std::unique_ptr也是個好想法&#xff0c;但是我想絕對我們中間沒有人喜歡寫像這樣std::unique_ptr<std:…

STM32第二十一天定時器TIM

1 定時器基礎知識a:上來說就是用來定時的機器&#xff0c;是存在于STM32單片機中的一個外設。STM32總共有8個定時器&#xff0c;分別是2個高級定時器(TIM1、TIM8)&#xff0c;4個通用定時器 (TIM2、TIM3、TIM4、TIM5) 和2個基本定時器 (TIM6、TIM7)&#xff0c;如下圖所示&…

鼎捷T100程序開發:校驗程序詳解

校驗程序概述 T100系統校驗程序需要確保系統數據的準確性、完整性和一致性&#xff0c;相當于企業信息系統的"健康體檢醫生"。它通過預設規則掃描系統數據&#xff0c;識別異常和錯誤&#xff0c;確保業務運行可靠。通過持續完善的校驗機制&#xff0c;企業能夠構建數…

BaseDao 通用查詢方法設計與實現

BaseDao 通用查詢方法設計與實現 一、通用查詢方法設計思路 1. 核心查詢功能矩陣查詢類型方法名功能說明復雜度主鍵查詢findById()根據主鍵獲取單個實體?全量查詢findAll()獲取全部實體?條件查詢findByCondition()動態條件查詢???分頁查詢findPage()分頁結果集????排序…