2013-01-22 30 views
152

Tôi đang làm việc với mã với ném rất nhiều (đối với tôi tại thời điểm này) cảnh báo vô dụng bằng cách sử dụng thư viện warnings. Đọc (/ quét) tài liệu tôi chỉ tìm thấy cách to disable warnings for single functions. Nhưng tôi không muốn thay đổi quá nhiều mã.Làm thế nào để vô hiệu hóa cảnh báo python

Có thể có cờ như python -no-warning foo.py không?

Bạn sẽ đề xuất điều gì?

+4

Tại sao bạn muốn tắt cảnh báo? Sẽ không sửa chữa/giải quyết chúng tốt hơn trong ngắn hạn + dài hạn? Cảnh báo thường được nêu ra vì một lý do, bỏ qua/im lặng chúng có lẽ sẽ dẫn đến những vấn đề lớn hơn trong tương lai. –

+5

Bạn hoàn toàn đúng, tôi đã cho bạn một +1 cho bình luận của bạn, nhưng có như tôi đã viết "tại thời điểm này" vô dụng đối với tôi. – Framester

+5

@MartinSamson Tôi thường đồng ý, nhưng có những trường hợp hợp pháp để bỏ qua cảnh báo. Tôi nhận được một số trong số này từ việc sử dụng cú pháp Xpath hợp lệ trong defusedxml: 'FutureWarning: Tìm kiếm này bị hỏng trong phiên bản 1.3 trở về trước và sẽ được sửa trong phiên bản sau. Nếu bạn dựa vào hành vi hiện tại, hãy thay đổi nó thành [điều khác] này '. Tôi thà phớt lờ những lời cảnh báo ngay bây giờ và chờ cho nó được âm thầm cố định hơn viết mã không cần thiết xấu xí chỉ để tránh một cảnh báo vô hại. – Pedro

Trả lời

213

có nhìn vào phần suppress warnings của các tài liệu python?

Nếu bạn đang sử dụng mã mà bạn biết sẽ nâng cao một cảnh báo, chẳng hạn như một hàm phản đối, nhưng không muốn thấy cảnh báo, sau đó nó có thể ngăn chặn các cảnh báo bằng cách sử dụng quản lý catch_warnings bối cảnh:

import warnings 

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

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

tôi không bỏ qua nó, nhưng bạn chỉ có thể surpress tất cả các cảnh báo với điều này:

import warnings 
warnings.filterwarnings("ignore") 

Ex:

>>> 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 
+0

Vì vậy, bạn phải quấn mã trong mỗi tệp bằng 'với warnings.catch_warnings():'? – Framester

+7

@Framester - vâng, IMO đây là cách gọn gàng nhất để ngăn chặn các cảnh báo cụ thể, cảnh báo có thể nói chung vì có điều gì đó sai, do đó, triệt tiêu tất cả các cảnh báo thông qua dòng lệnh có thể không phải là đặt cược tốt nhất. – Mike

+1

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

46

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" 

thử nghiệm 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') 
>>> 
+5

FWIW "tính năng mới trong năm 2010" có nghĩa là công trình này cho Python 2.7 nhưng không cho phiên bản 2.6 hoặc cũ hơn 2.x. (Tôi đã phải tìm kiếm nó. Tôi vẫn còn có Python 2.6 trong sản xuất ...) –

+2

Right. Python 2.7 được thêm –

+1

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

2

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

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

cảnh báo vẫn còn đúng chỗ, nhưng mọi thứ bạn muốn đều được chuyển tiếp. sự tái trực tiếp của stderr sẽ để lại cho bạn đầu ra sạch/shell mặc dù bản thân nội dung stdout không thay đổi.

trả lời FriendFX. câu một (1) trả lời trực tiếp vấn đề với một giải pháp phổ quát. câu hai (2) đưa vào tài khoản các trích dẫn neo lại 'vô hiệu hóa cảnh báo' đó là python 2,6 cụ thể và ghi chú rằng RHEL/centos 6 người dùng 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, nhưng hai (2) trả lời câu hỏi 2.6 mà tôi thường gặp nhất trong các mô-đun mã hóa và cách "hiện đại hóa" (nghĩa là nâng cấp, backport, sửa lỗi) hiệu suất HTTPS/TLS của python . para 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.

+2

Cảm ơn bạn đã dành thời gian trả lời. Xin vui lòng giữ câu trả lời đúng về chủ đề mặc dù: Bạn đề cập đến khá một vài điều mà không liên quan đến câu hỏi như nó hiện đang đứng, chẳng hạn như CentOS, Python 2.6, mật mã, các urllib, back-porting. Bạn có thể chỉnh sửa câu hỏi của mình để xóa các bit đó. Nếu bạn muốn biết thêm chi tiết từ OP, hãy để lại nhận xét dưới câu hỏi. – FriendFX

4

Đây là một câu hỏi cũ nhưng có một số hướng dẫn mới 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 này được khuyến cáo là nó tắt tất cả cảnh báo theo mặc định nhưng chủ yếu cho phép họ được bật lại thông qua python -W trên dòng lệnh hoặc PYTHONWARNINGS.