파이썬 경고를 비활성화하는 방법


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

1
비활성화 특정 경고 : stackoverflow.com/questions/9134795/...
user3226167

답변:



576

파이썬 문서의 경고 억제 섹션을 보셨습니까 ?

더 이상 사용되지 않는 함수와 같이 경고를 발생시키는 것으로 알고 있지만 경고를보고 싶지 않은 경우 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')
>>> 

이상 사용되지 않는 경고의 경우 더 이상 사용되지 않는 사용 중지 경고를 파이썬에서 살펴보십시오.

여기에 복사했습니다 ...

warnings모듈 문서에서 :

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

Windows를 사용하는 경우 : -W ignore::DeprecationWarningPython에 인수로 전달하십시오 . 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=ignoresetenv차종 출력 덜 더러운.
커트 부르 바키

2
AWS CLI에도 매우 유용합니다.
mckenzm의

1
그러나 이것은 사용 중단 경고를 무시하지 않습니다. 저것을 포함시키는 방법을 물어봐도 될까요?
웨이시


70

이것은 오래된 질문이지만 PEP 565 에는 파이썬 응용 프로그램을 작성하는 경우 모든 경고를 해제하는 새로운 지침 이 있습니다.

import sys
import warnings

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

이것이 권장되는 이유는 기본적으로 모든 경고를 끄지 만 python -W명령 줄 또는 을 통해 경고를 다시 켤 수 있기 때문 PYTHONWARNINGS입니다.


나중에 실행할 때 모든 경고를 비활성화하지 않기 때문에 완벽합니다
Orsiris de Jong

52

복잡한 것을 원하지 않으면 다음을 수행하십시오.

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 등의 암호화에 적용됩니다. https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2 의 proc을 사용하여 HTTPS 처리를 위해 2.6을 업데이트 할 수 있습니다

경고는 여전히 존재하지만 원하는 모든 것은 백 포트됩니다. stdout 내용 자체는 변경되지 않지만 stderr의 리디렉션은 깨끗한 터미널 / 쉘 출력으로 남겨 둡니다.

FriendFX에 응답합니다. 문장 하나 (1)는 보편적 인 해결책으로 문제에 직접 응답합니다. 문장 2 (2)는 python 2.6에 특화된 인용 된 '비활성화 경고'를 고려하고 RHEL / centos 6 사용자는 2.6 없이는 직접 수행 할 수 없습니다. 구체적인 경고가 언급되지 않았지만, 2 번 문단은 암호화 모듈의 단점을 가장 많이받는 2.6 질문과 파이썬의 HTTPS / TLS 성능을 "현대화"(즉, 업그레이드, 백 포트, 수정)하는 방법에 대해 자주 대답합니다. . 3 항 (3)은 단지 리디렉션을 사용하고 모듈 / 의존성을 업그레이드 한 결과를 설명합니다.


4
답변 해 주셔서 감사합니다. 그래도 주제에 대한 답변을 엄격하게 유지하십시오. CentOS, Python 2.6, 암호화, urllib, 백 포팅과 같이 현재의 질문과 관련이없는 몇 가지 사항을 언급합니다. 해당 비트를 제거하기 위해 질문을 편집 할 수 있습니다. OP에서 자세한 내용을 알고 싶다면 질문 아래에 의견을 남겨주십시오.
FriendFX
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.