Cara menonaktifkan peringatan python


421

Saya bekerja dengan kode yang melempar banyak (untuk saya saat ini) peringatan tidak berguna menggunakan warningsperpustakaan. Membaca (/ memindai) dokumentasi saya hanya menemukan cara untuk menonaktifkan peringatan untuk fungsi tunggal . Tetapi saya tidak ingin mengubah begitu banyak kode.

Apakah mungkin ada bendera python -no-warning foo.py?

Apa yang akan kamu rekomendasikan?


9
@ MartinSamson Saya umumnya setuju, tetapi ada kasus yang sah untuk mengabaikan peringatan. Saya mendapatkan beberapa ini menggunakan sintaks XPath berlaku di defusedxml: 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]. Saya lebih suka mengabaikan peringatan sekarang dan menunggu itu diam-diam diperbaiki daripada menulis kode jelek hanya untuk menghindari peringatan yang tidak berbahaya.
Pedro

1
nonaktifkan peringatan spesifik: stackoverflow.com/questions/9134795/…
user3226167

Jawaban:



576

Apakah Anda melihat bagian peringatan penekan python docs?

Jika Anda menggunakan kode yang Anda tahu akan memunculkan peringatan, seperti fungsi yang sudah tidak digunakan lagi, tetapi tidak ingin melihat peringatan itu, maka dimungkinkan untuk menekan peringatan menggunakan konteks manager catch_warnings:

import warnings

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

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

Saya tidak memaafkannya, tetapi Anda bisa menekan semua peringatan dengan ini:

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

12
@Framester - ya, IMO ini adalah cara terbersih untuk menekan peringatan tertentu, peringatan ada secara umum karena ada sesuatu yang salah, jadi menekan semua peringatan melalui baris perintah mungkin bukan taruhan terbaik.
Mike

1
@Framester - Saya mencantumkan opsi lain dengan contoh juga ... Saya tidak terlalu menyukainya (karena alasan saya berikan dalam komentar sebelumnya) tetapi setidaknya sekarang Anda memiliki alat.
Mike

41
Jika Anda hanya berharap untuk menangkap peringatan dari kategori tertentu, Anda dapat meneruskannya menggunakan categoryargumen:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach

1
Ini berguna bagi saya dalam hal ini karena html5lib memuntahkan peringatan lxml meskipun tidak mem-parsing xml. Terima kasih
jamescampbell

5
Ada juga parameter yang berguna untuk warnings.filterwarnings fungsi: module. Ini memungkinkan Anda untuk mengabaikan peringatan dari modul yang ditentukan.
nama pengguna

104

Anda juga dapat mendefinisikan variabel lingkungan (fitur baru di 2010 - yaitu python 2.7)

export PYTHONWARNINGS="ignore"

Tes seperti ini: Default

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

Abaikan peringatan

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

Untuk peringatan penghentian lihatlah cara-to-abaikan-penghentian-peringatan-di-python

Disalin di sini ...

Dari dokumentasi warningsmodul :

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

Jika Anda menggunakan Windows: berikan -W ignore::DeprecationWarningargumen ke Python. Lebih baik menyelesaikan masalah ini, dengan melakukan casting ke int .

(Perhatikan bahwa dalam Python 3.2, peringatan penghentian diabaikan secara default.)

Atau:

import warnings

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

yourcode()

Sekarang Anda masih mendapatkan semua yang lain DeprecationWarning, tetapi bukan yang disebabkan oleh:

import md5, sha

2
Ini sangat berguna untuk mengabaikan peringatan saat melakukan tes. Menggunakan tox, menambahkan PYTHONWARNINGS=ignoreuntuk setenvkeluaran merek kurang kotor.
Kurt Bourbaki

2
Sangat berguna untuk AWS CLI juga.
mckenzm

1
Tapi ini tidak mengabaikan peringatan penghentian. Bolehkah saya bertanya bagaimana cara memasukkan yang itu?
Wey Shi


70

Ini adalah pertanyaan lama tetapi ada beberapa panduan baru di PEP 565 yang untuk mematikan semua peringatan jika Anda sedang menulis aplikasi python yang harus Anda gunakan:

import sys
import warnings

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

Alasan ini direkomendasikan adalah bahwa ini mematikan semua peringatan secara default tetapi yang paling penting memungkinkan mereka untuk diaktifkan kembali melalui python -Wpada baris perintah atau PYTHONWARNINGS.


Ini sempurna karena tidak akan menonaktifkan semua peringatan di eksekusi nanti
Orsiris de Jong

53

Jika Anda tidak ingin sesuatu yang rumit, maka:

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

10
Dan untuk mengembalikan semuanya ke perilaku default:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester

17

Jika Anda tahu peringatan tidak berguna yang biasanya Anda temui, Anda dapat memfilternya melalui pesan.

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

Saya menyadari ini hanya berlaku untuk ceruk situasi, tetapi dalam numpykonteks saya sangat suka menggunakan np.errstate:

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

Namun, menggunakan np.errstate:

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

Bagian terbaiknya adalah Anda dapat menerapkan ini hanya pada baris kode yang sangat spesifik.


-5

peringatan adalah output melalui stderr dan solusi sederhana adalah menambahkan '2> / dev / null' ke CLI. ini masuk akal bagi banyak pengguna seperti mereka yang menggunakan centos 6 yang terjebak dengan dependensi python 2.6 (seperti yum) dan berbagai modul didorong ke tepi kepunahan dalam jangkauan mereka.

ini terutama berlaku untuk kriptografi yang melibatkan SNI dan lain-lain. seseorang dapat memperbarui 2.6 untuk penanganan HTTPS menggunakan proc di: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

peringatan masih ada di tempat, tetapi semua yang Anda inginkan adalah port-porting. mengarahkan ulang stderr akan meninggalkan Anda dengan terminal / output shell bersih meskipun konten stdout itu sendiri tidak berubah.

menanggapi FriendFX. kalimat satu (1) merespons langsung ke masalah dengan solusi universal. kalimat dua (2) mempertimbangkan jangkar yang dikutip ulang 'menonaktifkan peringatan' yang merupakan python 2.6 spesifik dan mencatat bahwa pengguna RHEL / centos 6 tidak dapat secara langsung melakukannya tanpa 2.6. meskipun tidak ada peringatan khusus yang dikutip, para dua (2) menjawab pertanyaan 2.6 yang paling sering saya dapatkan adalah kedatangan singkat dalam modul kriptografi dan bagaimana seseorang dapat "memodernisasi" (yaitu, meningkatkan, mendukung, memperbaiki) kinerja HTTPS / TLS python . para tiga (3) hanya menjelaskan hasil penggunaan pengarahan ulang dan peningkatan modul / dependensi.


4
Terima kasih telah meluangkan waktu untuk menjawab. Tetap pertahankan jawaban sesuai topik: Anda menyebutkan beberapa hal yang tidak relevan dengan pertanyaan seperti saat ini, seperti CentOS, Python 2.6, kriptografi, urllib, porting-belakang. Anda dapat mengedit pertanyaan Anda untuk menghapus bit-bit itu. Jika Anda ingin mengetahui lebih detail dari OP, tinggalkan komentar di bawah pertanyaan.
FriendFX
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.