파이썬 코드에서 사용하는 타사 라이브러리 (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