[ 英文 | 中文]
ObjWatch 是一個強大的 Python 函式庫,旨在簡化複雜專案的偵錯和監控。透過提供物件屬性和方法呼叫的即時追蹤,ObjWatch 使開發人員能夠更深入地了解其程式碼庫,從而促進問題見解、效能最佳化和整體程式碼品質增強。
ObjWatch 可能會影響您的應用程式的效能。建議僅在調試環境中使用它。
巢狀結構追蹤:透過清晰的分層日誌記錄視覺化和監控巢狀函數呼叫和物件互動。
增強的日誌記錄支援:利用 Python 的內建日誌記錄模組進行結構化、可自訂的日誌輸出,包括對簡單和詳細格式的支援。此外,為了確保即使記錄器被外部程式庫停用或刪除也能擷取日誌,您可以設定 level="force"。當 level 設定為「force」時,ObjWatch 會繞過標準日誌處理程序並使用 print() 來…
在讀取和調試複雜項目時,經常會遇到多達十幾層的嵌套調用,導致難以確定執行順序。最令人沮喪的方面是在多進程環境中進行偵錯;調試單一進程常常會導致其他進程等待並逾時,需要不斷重新啟動偵錯程式。頻繁使用print語句會導致錯過函數調用,費時費力。目前還沒有一個兼具簡單性和全面性的調試庫,所以我花了一個週末開發了一個工具來解決這個痛點。
ObjWatch 專為簡化複雜專案的調試和監控而設計。它提供物件屬性和方法呼叫的即時追蹤,並允許自訂掛鉤來幫助開發人員更深入地了解程式碼庫。
您可以直接使用 pip install objwatch 安裝它。為了演示目的,您需要克隆原始程式碼:
git clone https://github.com/aeeeeeep/objwatch cd objwatch pip install . python3 examples/example_usage.py
執行上述程式碼會產生以下呼叫資訊:
[2025-01-04 19:15:13] [DEBUG] objwatch: Processed targets: >>>>>>>>>> examples/example_usage.py <<<<<<<<<< [2025-01-04 19:15:13] [WARNING] objwatch: wrapper 'BaseLogger' loaded [2025-01-04 19:15:13] [INFO] objwatch: Starting ObjWatch tracing. [2025-01-04 19:15:13] [INFO] objwatch: Starting tracing. [2025-01-04 19:15:13] [DEBUG] objwatch: run main <- [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.__init__ <- '0':(type)SampleClass, '1':10 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.__init__ -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value None -> 10 [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 10 -> 11 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 11 -> 12 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 12 -> 13 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 13 -> 14 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 14 -> 15 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 15 -> 14 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 14 -> 13 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 13 -> 12 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None [2025-01-04 19:15:13] [DEBUG] objwatch: end main -> None [2025-01-04 19:15:13] [INFO] objwatch: Stopping ObjWatch tracing. [2025-01-04 19:15:13] [INFO] objwatch: Stopping tracing.
程式碼中最關鍵的部分如下:
# Using as a Context Manager with Detailed Logging with objwatch.ObjWatch(['examples/example_usage.py']): main() # Using the API with Simple Logging obj_watch = objwatch.watch(['examples/example_usage.py']) main() obj_watch.stop()
我們可以透過上下文管理器和 API 呼叫來使用該工具。在範例中,我們指定對examples/example_usage.py 檔案進行跟踪,這表示工具將記錄examples/example_usage.py 中的任何函數、方法或變數。這種清晰的分層日誌記錄有助於視覺化和監視巢狀函數呼叫和物件互動。列印的日誌包括以下幾個執行類型:
範例相對簡單,但此功能對於執行大型專案非常有用。
ObjWatch 提供以下介面:
ObjWatch 提供了 FunctionWrapper 抽象基類,允許使用者建立自訂包裝器來擴展和自訂庫的追蹤和日誌記錄功能。透過繼承FunctionWrapper,開發人員可以實現針對特定專案需求的客製化行為。這些行為會在函數呼叫和返回時執行,提供更專業的監控。
FunctionWrapper 類別定義了兩個必須實作的核心方法:
該方法在函數呼叫開始時被呼叫。它接收函數名稱和當前幀對象,其中包含執行上下文,包括局部變數和呼叫堆疊。實現此方法以在函數執行之前提取、記錄或修改資訊。
此方法在函數傳回時呼叫。它接收函數名稱和函數傳回的結果。使用此方法在函數完成執行後記錄、分析或變更資訊。
當變數更新時會觸發方法,接收舊值和目前值。它可用於記錄變數的更改,從而允許追蹤和調試變數狀態轉換。
有關框架物件的更多詳細信息,請參閱Python官方文件。
這是我根據我的使用場景實現的自訂包裝器的範例。程式碼位於 objwatch/wrappers.py 檔案中。此包裝器會自動記錄指定模組內所有函數方法呼叫中輸入和輸出的張量形狀以及變數的狀態。這對於理解複雜分散式框架的執行邏輯非常有用。
git clone https://github.com/aeeeeeep/objwatch cd objwatch pip install . python3 examples/example_usage.py
在深度學習項目中,張量的形狀和維度至關重要。小尺寸誤差可能會導致整個模型無法正確訓練或預測。手動檢查每個張量的形狀既乏味又容易出錯。 TensorShapeLogger 自動記錄張量形狀,幫助開發人員:
建議參考tests/test_torch_train.py檔。該文件包含 PyTorch 訓練過程的完整範例,演示如何整合 ObjWatch 進行監控和日誌記錄。
⚠️ 效能警告
在調試環境中使用 ObjWatch 會影響程式的效能。因此,建議僅在調試和開發階段使用它。
這只是初步的寫作;我計劃隨著時間的推移添加更多。如果您覺得有用,請隨意給它一個star。
該庫仍在積極更新中。如果您有任何問題或建議,請發表評論或在儲存庫中開啟問題。
以上是調試救星!利用 ObjWatch 在複雜的 Python 專案中進行高效的程式碼理解和調試的詳細內容。更多資訊請關注PHP中文網其他相關文章!