Pythonの警告を無効にする方法


420

warningsライブラリを使用して、多くの(現時点では)役に立たない警告をスローするコードを使用しています。ドキュメントの読み取り(/スキャン)単一の関数の警告を無効にする方法見つけました。しかし、私はコードの多くを変更したくありません。

たぶん次のような旗はありpython -no-warning foo.pyますか?

あなたは何をお勧めします?


9
@MartinSamson私は概ね同意しますが、警告を無視する正当な場合があります。これらのいくつかは、defusedxmlで有効なXpath構文を使用することで得られます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]。今は警告を無視して、無害な警告を回避するためだけに不必要に醜いコードを書くよりも、警告が静かに修正されるのを待ちます。
Pedro

回答:



576

あなたはPythonドキュメントの抑制警告セクションを見ましたか?

非推奨の関数など、警告が発生することがわかっているが警告を表示したくないコードを使用している場合は、catch_warningsコンテキストマネージャを使用して警告を抑制することができます。

import warnings

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

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

私はそれを容赦しませんが、これですべての警告抑制することができます:

import warnings
warnings.filterwarnings("ignore")

例:

>>> 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-はい、IMOこれは特定の警告を抑制する最もクリーンな方法です。警告は一般的に何かが間違っている可能性があるため存在します。したがって、コマンドラインですべての警告を抑制することは最善の策ではない可能性があります。
Mike

1
@Framester-私は他のオプションも例とともにリストしました...私はそれがあまり好きではありませんが(前のコメントで述べた理由により)、少なくとも今はツールがあります。
Mike

41
あなたが唯一の特定のカテゴリからキャッチ警告に期待していた場合は、使用してそれを渡すことができcategory、引数を:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach

1
html5libはxmlを解析していなくても、lxmlの警告を出力するため、これは私にとってこの場合に役立ちます。ありがとう
jamescampbell

5
warnings.filterwarnings 関数には便利なパラメーターもありますmodule。指定したモジュールからの警告を無視することができます。
ユーザー名

104

環境変数を定義することもできます(2010の新機能-python 2.7)

export PYTHONWARNINGS="ignore"

このようなテスト:デフォルト

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

警告を無視する

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

ために 非推奨の警告は、how-to-ignore-deprecation-warnings-in-pythonをご覧ください。

ここにコピーしました...

のドキュメントから warningsモジュールの

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

Windowsを使用している場合:-W ignore::DeprecationWarning引数としてPythonに渡します。にキャストすることで、問題を解決するのがより良いです intに

(Python 3.2では、デフォルトで非推奨の警告が無視されることに注意してください。)

または:

import warnings

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

yourcode()

これで、他DeprecationWarningのすべてのを取得できますが、次の原因が原因ではありません。

import md5, sha

2
これは、テストを実行するときに警告を無視するのに特に役立ちます。を使用してtoxに追加PYTHONWARNINGS=ignoreするとsetenv、出力の汚れが少なくなります。
カートブルバキ2016年

2
AWS CLIにも非常に役立ちます。
mckenzm

1
しかし、これは非推奨の警告を無視しません。それを含める方法を尋ねてもいいですか?
Wey Shi、


70

これは古い質問ですが、Pythonアプリケーションを作成している場合にすべての警告をオフにするためのPEP 565の新しいガイダンスがいくつかあります。

import sys
import warnings

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

これが推奨される理由は、デフォルトですべての警告をオフにしますがpython -W、コマンドラインまたはで警告をオンに戻すことができるためPYTHONWARNINGSです。


後の実行ですべての警告が無効になるわけではないため、これは完璧です
Orsiris de Jong

53

複雑なものを使いたくない場合は、次のようにします。

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

10
そして、物事をデフォルトの動作に戻すには:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester

17

通常発生する役に立たない警告を知っている場合は、メッセージでそれらをフィルタリングできます。

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

私はこれが状況のニッチにのみ適用可能であることを理解していますが、numpy私が本当に使用したい状況ではnp.errstate

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

ただし、使用np.errstate

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

最も良い点は、これを特定のコード行にのみ適用できることです。


-5

警告はstderrを介して出力され、簡単な解決策はCLIに「2> / dev / null」を追加することです。これは、Python 2.6の依存関係(yumなど)で立ち往生していて、さまざまなモジュールがカバレッジで絶滅の危機に瀕しているcentos 6のユーザーなど、多くのユーザーにとって非常に理にかなっています。

これは、SNIなどを含む暗号化に特に当てはまります。次の場所にあるprocを使用して、HTTPS処理用に2.6を更新できます。 https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2のます。

警告はまだ残っていますが、必要なものはすべてバックポートされています。stderrのリダイレクトにより、stdoutのコンテンツ自体は変更されませんが、クリーンなターミナル/シェル出力が残ります。

FriendFXに応答します。文1は、普遍的な解決策で問題に直接対応します。2番目の文は、引用されたアンカーの「警告を無効にする」を考慮に入れています。これはpython 2.6固有であり、RHEL / centos 6ユーザーは2.6なしでは直接実行できないことを示しています。具体的な警告は引用されていませんが、2番目のパラグラフ(2)は2.6の質問に答えます。暗号化モジュールの短所と、PythonのHTTPS / TLSパフォーマンスを「近代化」(つまり、アップグレード、バックポート、修正)する方法について。3番目のパラグラフ(3)は、リダイレクトの使用とモジュール/依存関係のアップグレードの結果を説明するだけです。


4
お時間を割いていただきありがとうございます。ただし、トピックについては厳格に回答してください。CentOS、Python 2.6、暗号化、urllib、バックポーティングなど、現在のところ問題とは無関係のかなりの数について言及しています。質問を編集して、これらのビットを削除できます。OPの詳細を知りたい場合は、代わりに質問の下にコメントを残してください。
FriendFX 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.