HOWTO · Python

抑制 Python 中的警告

本教程演示瞭如何在 python 中抑制程式中的警告。

本頁內容

若要抑制 Python 警告,請依需求選擇適用範圍:在腳本中使用 warnings.filterwarnings()、使用 python -W ignore script.py 僅影響單一程序,或在啟動 Python 前設定 PYTHONWARNINGS=ignore。你也可以只篩選特定警告類別,或使用情境管理器,只在特定程式碼區塊中抑制訊息。

警告會指出可能需要留意的情況,例如使用已棄用的 API。警告本身不會停止執行;例外則代表執行階段發生錯誤,可能中斷特定操作,若未處理也可能向外傳播。隱藏警告前請先閱讀內容:抑制警告可能掩蓋日後會造成影響的相容性問題。

使用 warnings 模組抑制警告

標準函式庫中的 warnings 模組可讓腳本篩選訊息。呼叫 warnings.filterwarnings("ignore") 可廣泛忽略該程序的警告;也可以傳入類別或訊息等條件,只篩選部分警告。篩選器只會影響符合條件的警告,其他警告仍會顯示。請將範圍較窄的篩選器放在需要它的程式碼附近,並在根本問題解決後移除篩選器。

請執行以下獨立範例:

import warnings

warnings.filterwarnings("ignore", category=UserWarning, message="cache is stale")
warnings.warn("cache is stale", UserWarning)
print("program continues")
program continues

此篩選器會比對以指定文字開頭的 UserWarning 訊息,因此符合條件的警告會被隱藏。最後的列印會顯示 program continues;這個標籤維持英文。它說明警告呼叫之後,程式仍會繼續執行。

若要暫時套用篩選器,請使用 warnings.catch_warnings(),並在其 with 區塊內設定篩選器。區塊結束時,Python 會還原進入區塊前生效的警告篩選狀態。當你想在已知會產生雜訊的操作附近暫時隱藏警告,同時讓其他程式碼維持原有的警告設定時,這種方式就很有用。例如,可採用以下模式:with warnings.catch_warnings(): warnings.simplefilter("ignore", category=DeprecationWarning); operation()。請將操作放在區塊內;離開區塊後的呼叫會使用還原後的篩選器。

從命令列抑制警告

在腳本名稱之前傳入 Python 的 -W 選項,即可在直譯器啟動時設定警告篩選器。若要忽略該程序的警告,請執行 python -W ignore script.py,或使用等效的簡寫形式 python -Wignore script.py。受保護的拼法 -Wignore 是將 ignore 動作直接接在選項後面。請將 script.py 換成你的檔名,並將任何腳本引數保留在檔名之後。

此選項會在直譯器啟動時生效,不會修改腳本。若要執行無法修改的工具,或只想單次執行時套用設定,這種方式很實用。命令列篩選器可能會在整次執行期間隱藏有用的診斷訊息;若廣泛抑制會遮蔽你需要的資訊,請改用指定警告類別的篩選器。

使用 PYTHONWARNINGS 環境變數抑制警告

在啟動 Python 前設定 PYTHONWARNINGS,即可將警告篩選動作傳給新程序。例如,在 POSIX shell 中使用 PYTHONWARNINGS=ignore python script.py;在 PowerShell 中使用 $env:PYTHONWARNINGS = "ignore",接著執行 python script.py。這些設定方式依 shell 而異,而且直譯器啟動時,環境中必須已有此變數。

當啟動器或部署環境負責控制程序時,使用環境變數設定會很方便。它會影響以該環境啟動的 Python 程序,不會改變已在執行中的直譯器所採用的警告設定。若要再次顯示警告,請移除這個變數,或改用範圍較窄的篩選器。無論採用哪一種方法,都只應抑制已評估過的訊息,並隨相依套件與 API 的變化重新檢視篩選器。