Cách vô hiệu hóa cảnh báo trăn


420

Tôi đang làm việc với mã mà ném rất nhiều (cho tôi vào lúc này) những cảnh báo vô dụng khi sử dụng warningsthư viện. Đọc (/ quét) tài liệu tôi chỉ tìm thấy một cách để vô hiệu hóa các cảnh báo cho các chức năng đơn lẻ . Nhưng tôi không muốn thay đổi quá nhiều mã.

Có thể có một lá cờ như thế python -no-warning foo.pynào?

Bạn muốn giới thiệu gì?


9
@MartinSamson Tôi thường đồng ý, nhưng có những trường hợp hợp pháp để bỏ qua các cảnh báo. Tôi nhận được một vài trong số này từ việc sử dụng cú pháp Xpath hợp lệ trong defusexml : FutureWarning: This search is broken in 1.3 and earlier, and will be fixed in a future version. If you rely on the current behaviour, change it to [this other thing]. Tôi thà bỏ qua các cảnh báo bây giờ và chờ đợi nó được sửa chữa âm thầm hơn là viết mã xấu xí không cần thiết chỉ để tránh một cảnh báo vô hại.
Pedro

1
vô hiệu hóa các cảnh báo cụ thể: stackoverflow.com/questions/9134795/ từ
user3226167

Câu trả lời:



576

Bạn đã xem phần cảnh báo đàn áp của tài liệu python chưa?

Nếu bạn đang sử dụng mã mà bạn biết sẽ đưa ra cảnh báo, chẳng hạn như hàm không dùng nữa, nhưng không muốn xem cảnh báo, thì có thể loại bỏ cảnh báo bằng trình quản lý bối cảnh Catch_warnings:

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()

Tôi không tha thứ cho nó, nhưng bạn chỉ có thể ngăn chặn tất cả các cảnh báo với điều này:

import warnings
warnings.filterwarnings("ignore")

Ví dụ:

>>> import warnings
>>> def f():
...  print('before')
...  warnings.warn('you are warned!')
...  print('after')
>>> f()
before
__main__:3: UserWarning: you are warned!
after
>>> warnings.filterwarnings("ignore")
>>> f()
before
after

12
@Framester - vâng, IMO đây là cách sạch nhất để loại bỏ các cảnh báo cụ thể, nói chung là có cảnh báo vì có thể có gì đó không đúng, do đó, loại bỏ tất cả các cảnh báo qua dòng lệnh có thể không phải là đặt cược tốt nhất.
Mike

1
@Framester - Tôi cũng liệt kê tùy chọn khác với một ví dụ ... Tôi không thích nó nhiều (vì lý do tôi đã đưa ra trong nhận xét trước đó) nhưng ít nhất bây giờ bạn có các công cụ.
Mike

41
Nếu bạn chỉ mong bắt được các cảnh báo từ một danh mục cụ thể, bạn có thể vượt qua nó bằng cách sử dụng categoryđối số:warnings.filterwarnings("ignore", category=DeprecationWarning)
Ostrokach

1
Điều này hữu ích cho tôi trong trường hợp này vì html5lib đưa ra các cảnh báo lxml mặc dù nó không phân tích cú pháp xml. Cảm ơn
jamescampbell

5
Ngoài ra còn có một tham số hữu ích cho warnings.filterwarnings chức năng : module. Nó cho phép bạn bỏ qua các cảnh báo từ mô-đun được chỉ định.
tên người dùng

104

Bạn cũng có thể xác định một biến môi trường (tính năng mới trong năm 2010 - tức là python 2.7)

export PYTHONWARNINGS="ignore"

Kiểm tra như thế này: Mặc định

$ export PYTHONWARNINGS="default"
$ python
>>> import warnings
>>> warnings.warn('my warning')
__main__:1: UserWarning: my warning
>>>

Bỏ qua cảnh báo

$ export PYTHONWARNINGS="ignore"
$ python
>>> import warnings
>>> warnings.warn('my warning')
>>> 

Đối với các cảnh báo khấu hao, hãy xem làm thế nào để bỏ qua-khấu hao-cảnh báo-trong-trăn

Sao chép ở đây ...

Từ tài liệu của warningsmô-đun :

 #!/usr/bin/env python -W ignore::DeprecationWarning

Nếu bạn đang ở trên Windows: chuyển -W ignore::DeprecationWarninglàm đối số cho Python. Mặc dù tốt hơn để giải quyết vấn đề, bằng cách chuyển sang int .

(Lưu ý rằng trong Python 3.2, các cảnh báo không dùng nữa được bỏ qua theo mặc định.)

Hoặc là:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    import md5, sha

yourcode()

Bây giờ bạn vẫn nhận được tất cả các DeprecationWarnings khác , nhưng không phải là những nguyên nhân gây ra bởi:

import md5, sha

2
Điều này đặc biệt hữu ích để bỏ qua các cảnh báo khi thực hiện các bài kiểm tra. Sử dụng tox, thêm vào PYTHONWARNINGS=ignoređể setenvlàm cho đầu ra ít bẩn hơn.
Kurt Bourbaki

2
Rất hữu ích cho AWS CLI.
mckenzm

1
Nhưng điều này không bỏ qua cảnh báo khấu hao. Tôi có thể hỏi làm thế nào để bao gồm cái đó?
Wey Shi


70

Đây là một câu hỏi cũ nhưng có một số hướng dẫn mới hơn trong PEP 565 để tắt tất cả các cảnh báo nếu bạn đang viết một ứng dụng python bạn nên sử dụng:

import sys
import warnings

if not sys.warnoptions:
    warnings.simplefilter("ignore")

Lý do điều này được khuyến nghị là nó tắt tất cả các cảnh báo theo mặc định nhưng chủ yếu cho phép chúng được bật lại thông qua python -Wtrên dòng lệnh hoặc PYTHONWARNINGS.


Điều này là hoàn hảo vì nó sẽ không vô hiệu hóa tất cả các cảnh báo trong lần thực hiện sau
Orsiris de Jong

53

Nếu bạn không muốn một cái gì đó phức tạp, thì:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

10
Và để biến mọi thứ trở lại hành vi mặc định:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester

17

Nếu bạn biết những cảnh báo vô dụng bạn thường gặp là gì, bạn có thể lọc chúng bằng tin nhắn.

import warnings

#ignore by message
warnings.filterwarnings("ignore", message="divide by zero encountered in divide")

#part of the message is also okay
warnings.filterwarnings("ignore", message="divide by zero encountered") 
warnings.filterwarnings("ignore", message="invalid value encountered")

0

Tôi nhận ra điều này chỉ áp dụng cho một tình huống thích hợp, nhưng trong numpybối cảnh tôi thực sự thích sử dụng np.errstate:

np.sqrt(-1)
__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan

Tuy nhiên, sử dụng np.errstate:

with np.errstate(invalid='ignore'):
    np.sqrt(-1)
nan

Phần tốt nhất là bạn chỉ có thể áp dụng điều này cho các dòng mã rất cụ thể.


-5

cảnh báo là đầu ra thông qua thiết bị lỗi chuẩn và giải pháp đơn giản là nối '2> / dev / null' vào CLI. điều này rất có ý nghĩa đối với nhiều người dùng, chẳng hạn như những người có centos 6 bị mắc kẹt với các phụ thuộc python 2.6 (như yum) và các mô-đun khác nhau đang bị đẩy đến bờ vực tuyệt chủng trong phạm vi bảo hiểm của họ.

điều này đặc biệt đúng đối với mật mã liên quan đến SNI et cetera. người ta có thể cập nhật 2.6 để xử lý HTTPS bằng cách sử dụng Proc tại: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

cảnh báo vẫn còn, nhưng tất cả mọi thứ bạn muốn đều được chuyển ngược lại. việc chuyển hướng lại của thiết bị xuất chuẩn sẽ khiến bạn có đầu ra / vỏ sạch mặc dù nội dung của thiết bị xuất chuẩn không thay đổi.

trả lời FriendFX. câu một (1) trả lời trực tiếp vấn đề bằng một giải pháp phổ quát. câu hai (2) có tính đến neo được trích dẫn 'vô hiệu hóa cảnh báo', đó là python 2.6 cụ thể và lưu ý rằng người dùng RHEL / centos 6 không thể trực tiếp làm mà không có 2.6. Mặc dù không có cảnh báo cụ thể nào được trích dẫn, đoạn hai (2) trả lời câu hỏi 2.6 mà tôi thường gặp nhất là các câu hỏi ngắn trong mô-đun mật mã và cách người ta có thể "hiện đại hóa" (nghĩa là nâng cấp, backport, sửa chữa) hiệu suất HTTPS / TLS của python . đoạn ba (3) chỉ giải thích kết quả của việc sử dụng lại trực tiếp và nâng cấp mô-đun / phụ thuộc.


4
Cảm ơn đã dành thời gian trả lời. Vui lòng giữ câu trả lời đúng chủ đề mặc dù: Bạn đề cập đến khá nhiều điều không liên quan đến câu hỏi vì nó hiện đang tồn tại, chẳng hạn như CentOS, Python 2.6, mật mã, urllib, back-port. Bạn có thể chỉnh sửa câu hỏi của bạn để loại bỏ các bit. Nếu bạn muốn biết thêm chi tiết từ OP, thay vào đó hãy để lại nhận xét dưới câu hỏi.
FriendFX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.