Python uyarıları nasıl devre dışı bırakılır


420

warningsKütüphaneyi kullanarak (şu anda benim için) işe yaramaz uyarıları bir sürü atar kod ile çalışıyorum . Belgeleri okuma (/ tarama) Yalnızca tek işlevler için uyarıları devre dışı bırakmanın bir yolunu buldum . Ama kodu çok fazla değiştirmek istemiyorum.

Belki bir bayrak var mı python -no-warning foo.py?

Ne önerirsiniz?


9
@MartinSamson Genel olarak katılıyorum, ancak uyarıları görmezden gelmenin meşru davaları var. Ben defusedxml geçerli XPath sözdizimi kullanarak bu birkaç olsun: 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]. Şimdi uyarıları görmezden gelmek ve sadece zararsız bir uyarı önlemek için gereksizce çirkin kod yazmak daha sessizce sabit olmasını beklemek istiyorum.
Pedro

1
belirli uyarıları devre dışı bırak: stackoverflow.com/questions/9134795/…
user3226167

Yanıtlar:



576

Eğer baktın mı bastırmak uyarıları piton dokümanlar bölümünde?

Kullanımdan kaldırılmış bir işlev gibi bir uyarı oluşturacağını bildiğiniz bir kod kullanıyorsanız ancak uyarıyı görmek istemiyorsanız, catch_warnings içerik yöneticisini kullanarak uyarıyı bastırmak mümkündür:

import warnings

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

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

Bunu göz ardı etmiyorum, ancak bununla tüm uyarıları bastırabilirsiniz :

import warnings
warnings.filterwarnings("ignore")

Ör:

>>> 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 - evet, IMO bu belirli uyarıları bastırmanın en temiz yoludur, genel olarak uyarılar vardır, çünkü bir şeyler yanlış olabilir, bu yüzden komut satırından tüm uyarıları bastırmak en iyi bahis olmayabilir.
Mike

1
@Framester - Diğer seçeneği de bir örnekle listeledim ... Çok fazla sevmiyorum (bu nedenle önceki yorumda verdim) ama en azından şimdi araçlara sahipsiniz.
Mike

41
Yalnızca belirli bir kategoriden uyarı almayı bekliyorsanız, şu categoryargümanı kullanarak iletebilirsiniz :warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach

1
Bu benim için yararlıdır çünkü html5lib xml ayrıştırmasa bile lxml uyarılarını çıkarır. Teşekkürler
jamescampbell

5
İçin yararlı bir parametre de vardır warnings.filterwarnings fonksiyonu: module. Belirtilen modülden gelen uyarıları yok saymanızı sağlar.
kullanıcı adı

104

Ayrıca bir ortam değişkeni de tanımlayabilirsiniz (2010'da yeni özellik - python 2.7)

export PYTHONWARNINGS="ignore"

Şunun gibi test et: Varsayılan

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

Uyarıları yoksay

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

Kullanımdan kaldırma uyarıları için, pitondaki kullanımdan kaldırma uyarılarını nasıl göz ardı edeceğinize bir göz atın

Buraya kopyalandı ...

warningsModülün belgelerinden :

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

Windows kullanıyorsanız: -W ignore::DeprecationWarningPython'a argüman olarak geçin. Sorunu çözmek için daha iyi, int .

(Python 3.2'de kullanımdan kaldırma uyarılarının varsayılan olarak yok sayıldığını unutmayın.)

Veya:

import warnings

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

yourcode()

Şimdi hala diğer tümleri elde edersiniz DeprecationWarning, ancak aşağıdakilerden kaynaklananları almazsınız :

import md5, sha

2
Bu, özellikle testler yaparken uyarıları göz ardı etmek için kullanışlıdır. Kullanılması tox, ekleme PYTHONWARNINGS=ignoreiçin setenvmarkaları çıktı az kirli.
Kurt Bourbaki

2
AWS CLI için de çok yararlı.
mckenzm

1
Ancak bu, kullanımdan kaldırma uyarısını göz ardı etmez. Bunu nasıl ekleyeceğimi sorabilir miyim?
Wey Shi


70

Bu eski bir soru ama PEP 565'te kullanmanız gereken bir python uygulaması yazıyorsanız tüm uyarıları kapatmak için daha yeni bir kılavuz var :

import sys
import warnings

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

Bunun önerilmesinin nedeni, tüm uyarıları varsayılan olarak kapatması python -W, ancak komut satırında veya üzerinden tekrar açılmalarına izin vermesidir PYTHONWARNINGS.


Bu, daha sonraki yürütmede tüm uyarıları devre dışı bırakmayacağından mükemmeldir
Orsiris de Jong

53

Karmaşık bir şey istemiyorsanız, o zaman:

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

10
Ve işleri varsayılan davranışa geri döndürmek için:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester

17

Genellikle karşılaştığınız işe yaramaz uyarıların ne olduğunu biliyorsanız, bunları mesajla filtreleyebilirsiniz.

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

Bunun sadece durumların bir nişi için geçerli olduğunu, ancak numpygerçekten kullanmayı sevdiğim bir bağlamda farkındayım np.errstate:

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

Ancak np.errstate:

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

En iyi yanı, bunu yalnızca çok özel kod satırlarına uygulayabilirsiniz.


-5

uyarılar stderr aracılığıyla verilir ve basit çözüm CLI'ye '2> / dev / null' eklemektir. bu, python 2.6 bağımlılıkları (yum gibi) ile sıkışmış centos 6 gibi birçok kullanıcı için çok mantıklıdır ve çeşitli modüller, kapsama alanlarındaki yok olma sınırına itilmektedir.

bu özellikle SNI et cetera'yı içeren kriptografi için geçerlidir. https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2 adresindeki proc'u kullanarak HTTPS kullanımı için 2.6'yı güncelleyebilirsiniz.

uyarı hala yerinde, ancak istediğiniz her şey geri taşındı. stderr'ın yeniden yönlendirilmesi, stdout içeriğinin kendisi değişmese de, sizi temiz terminal / kabuk çıkışı ile bırakacaktır.

FriendFX'e yanıt veriyor. cümle bir (1) evrensel bir çözümle soruna doğrudan yanıt verir. cümle iki (2), belirtilen çapanın yeniden python 2.6'ya özgü 'uyarıları devre dışı bırak' uyarısını dikkate alır ve RHEL / centos 6 kullanıcılarının 2.6 olmadan doğrudan yapamayacağını not eder. belirli bir uyarı yapılmamasına rağmen, iki paragraf (2) en sık şifreleme modülündeki kısa gelişmeleri ve python'un HTTPS / TLS performansını nasıl "modernize edebileceğini" (yani yükseltme, backport, düzeltme) 2.6 sorusunu cevaplıyor . üçüncü paragraf (3) sadece yeniden yönlendirmenin kullanılması ve modül / bağımlılıkların yükseltilmesinin sonucunu açıklamaktadır.


4
cevaplamak için zaman ayırdığınız için teşekkür ederiz. Lütfen cevapları kesinlikle konuyla ilgili olarak saklayın: CentOS, Python 2.6, kriptografi, urllib, geri taşıma gibi şu anki soru ile ilgisi olmayan birkaç şeyden bahsediyorsunuz. Bu bitleri kaldırmak için sorunuzu düzenleyebilirsiniz. OP'den daha fazla ayrıntı öğrenmek istiyorsanız, bunun yerine sorunun altına bir yorum bırakın.
FriendFX
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.