2012-02-03 3 views
22

私は、Pythonスクリプトで劣性いくつかの簡単な数学をやっているとフォロー警告取得しています:Pythonで特定の警告メッセージを取り除き、他のすべての警告を正常に保つには?

「警告:除算で発生したゼロによる除算」。

いくつかのコンテキストを提供するために、私は2つの値を取り、値(a - b)/aで、その一定範囲以上は、それを処理し、時にはaまたはbの値がゼロであるかのパーセント差を見つけようとしています。

私は(特定の行で)この特定の警告が、私は今のところ(私はしたくない)すべての警告を停止する方法を私に示しているようだ発見したすべての情報を取り除きたいです。私はシェルスクリプトを記述するために使用する場合

、私は私がのために「コード」の警告を取得し、「さらに多くのコード」コマンドをではなくなり、その例では、この

code... 
more code 2 > error.txt 
even more code 

ような何かを行うことができます二行目。

これは可能ですか?

+0

を= = 0と計算をしない? – AlG

+0

これは通常のPythonの警告ではありません。実行しているコードを表示できますか? –

+0

これは例外ではなく、警告ではありませんか?あなたは 'ZeroDivisionError'をキャッチできませんか? – mpen

答えて

8

それは黙ってそれを抑制するよりも、警告を修正する方が簡単です:それはやって複雑ではありません

if not all([a, b]): 
    return False 

# Your actual code 

、しかし:

if a == 0 or b == 0: 
    return False 

# Your actual code 

それとも、Pythonの構文と空想を取得したい場合私はまだそれをしないだろう。 APIから:

numpy.seterr(divide='ignore') 
+0

感謝を分割していますエラーが発生していると思う – Lostsoul

+1

彼が本当に '(a-b)/ a'をやっているなら、aかbのどちらかがゼロかどうかを調べるのは愚かです。彼はちょうどaを点検する必要がある! – mpen

+0

@マーク:これは私が元々考えていたものですが、OPが**と言ったときにaまたはbの値がゼロになることがありました**、それは私を混乱させました。 – Blender

42

scipyのダウンロードはwarningsモジュールを使用している場合は、特定の警告を抑制することができます。あなたのプログラムの先頭でこれを試してみてください。

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

あなたは、これはコードの一断面のみに適用したい場合には、警告のコンテキストマネージャを使用します。またはbかどうかを確認しないのはなぜ

import warnings 
with warnings.catch_warnings(): 
    warnings.filterwarnings("ignore", message="divide by zero encountered in divide") 
    # .. your divide-by-zero code .. 
+0

どのようにですか?私はすべての警告を消すことができるのを見ましたが、特定のコード行をターゲットにすることは可能ですか? – Lostsoul

+0

ああ、ちょうどあなたの更新を見た!..ありがとう、私が探していたものでした。もう1つの質問ですが、警告メッセージを見つける特定の方法はありますか、それとも単に画面上に表示されるのでしょうか?私は "警告:あなたのコードは、lostsoulを吸う!"を得る場合、私はちょうどそれを上記のメッセージ変数に追加することができ、それはうまくいくでしょうか? – Lostsoul

+3

良い答え。実際には、警告を無視する方法のこの非常に簡単な説明を見つけるために私に驚くべき量のグーグルが必要でした。 @Lostsoulあなたはmessage = 'regex matching message'を使ってメッセージで警告をキャッチすることができます。また、行番号とモジュール名でキャッチするlineno =とmodule =引数もあります。 – cxrodgers

関連する問題