[python] 파이썬에서 예외 인 것처럼 경고를 어떻게 포착합니까?

파이썬 코드에서 사용하는 타사 라이브러리 (C로 작성)가 경고를 발행합니다. try except구문을 사용하여 이러한 경고를 올바르게 처리 할 수 있기를 원합니다 . 이 작업을 수행하는 방법이 있습니까?



답변

파이썬 핸드북 ( 27.6.4. 경고 테스트 ) 에서 인용하려면 :

import warnings

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

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)


답변

경고를 오류로 처리하려면 다음을 사용하십시오.

import warnings
warnings.filterwarnings("error")

그런 다음 오류와 동일한 경고를 포착 할 수 있습니다. 예를 들어 다음과 같이 작동합니다.

try:
    some_heavy_calculations()
except RuntimeWarning:
    import ipdb; ipdb.set_trace()

의견의 가장 좋은 대답이 오자 포함하기 때문에 PS는이 대답을 추가 : filterwarnigns대신 filterwarnings.


답변

경고에서 스크립트가 실패하도록하려면 다음을 사용할 수 있습니다.

python -W error foobar.py


답변

다음은 사용자 지정 경고 만 사용하는 방법을 더 명확하게하는 변형입니다.

import warnings
with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")

    # Call some code that triggers a custom warning.
    functionThatRaisesWarning()

    # ignore any non-custom warnings that may be in the list
    w = filter(lambda i: issubclass(i.category, UserWarning), w)

    if len(w):
        # do something with the first warning
        email_admins(w[0].message)


답변

어떤 경우에는 경고를 오류로 전환하기 위해 ctypes를 사용해야합니다. 예를 들면 :

str(b'test')  # no error
import warnings
warnings.simplefilter('error', BytesWarning)
str(b'test')  # still no error
import ctypes
ctypes.c_int.in_dll(ctypes.pythonapi, 'Py_BytesWarningFlag').value = 2
str(b'test')  # this raises an error


답변