用户警告的Stacktrace

gue*_*tli 6 python warnings

我在日志中看到这样的警告:

py.warnings.__init__: WARNING .../bs4/__init__.py:219: UserWarning: "foo" 
  looks like a filename, not markup. You should probably open this file 
  and pass the filehandle into Beautiful Soup
Run Code Online (Sandbox Code Playgroud)

这条消息没有多大帮助.

我希望看到堆栈跟踪发生这种情况.

请不要查看此警告的内容.这个问题不是关于美丽的汤:-)

一个简单的解决方案是修改第三方代码(bs4/__init__.py在第219行)并添加如下内容:

import traceback
logger.warn('Exc at ...\n%s' % ''.join(traceback.format_stack()))
Run Code Online (Sandbox Code Playgroud)

但我想避免这种情况.原因:

  • 这是来自生产系统的警告.我不想改变消息来源.
  • 下次发生这样的警告时,我希望立即看到堆栈跟踪

我可以更改python的标志或设置,不仅可以查看一行,还可以查看while stacktrace吗?我需要上面的帧来调试这个.

在这种环境下,Python 2.7被使用了.

小智 3

您需要执行以下操作:

  1. 如果 USER_SITE 不存在则创建:问题python -c "import site; site._script()",请参阅 USER_SITE 变量内容
  2. usercustomize.py使用以下代码将文件放入该目录中:

    import traceback
    import warnings
    
    
    _old_warn = warnings.warn
    def warn(*args, **kwargs):
        tb = traceback.extract_stack()
        _old_warn(*args, **kwargs)
        print("".join(traceback.format_list(tb)[:-1]))
    warnings.warn = warn
    
    Run Code Online (Sandbox Code Playgroud)

    归功于代码的答案。

像往常一样运行代码。我的测试代码:

import warnings

def f():
    warnings.warn("foz")

f()
Run Code Online (Sandbox Code Playgroud)

手术前:

$ python test_warn.py
test_warn.py:4: UserWarning: foz
  warnings.warn("foz")
Run Code Online (Sandbox Code Playgroud)

后:

$ python test_warn.py
<USER_SITE_REDACTED>/usercustomize.py:6: UserWarning: foz
  _old_warn(*args, **kwargs)
  File "test_warn.py", line 6, in <module>
    f()
  File "test_warn.py", line 4, in f
    warnings.warn("foz")
Run Code Online (Sandbox Code Playgroud)