python - 无法在异步调用的函数中放入 Python 调试器?

标签 python django asynchronous ipdb airbrake

为了调试 Airbrake throwing error "pybrake - ERROR - strconv.ParseInt: parsing "None": invalid syntax" 中描述的 Airbrake 问题, 我试图在将请求发送到 Airbrake 之前检查请求,方法是使用 import ipdb; 放入 iPython 调试器; ipdb.set_trace().

为了检查请求,我在 Notifiersend_notic_sync() 方法中设置了跟踪(参见 https://github.com/airbrake/pybrake/blob/master/pybrake/notifier.py ):

 def send_notice_sync(self, notice):
    """Sends notice to Airbrake.

    It returns notice with 2 possible new keys:
    - {'id' => str} - notice id on success.
    - {'error' => str|Exception} - error on failure.
    """
    for fn in self._filters:
      r = fn(notice)
      if r is None:
        notice['error'] = 'notice is filtered out'
        return notice
      notice = r

    if time.time() < self._rate_limit_reset:
      notice['error'] = _ERR_IP_RATE_LIMITED
      return notice

    data = jsonify_notice(notice)
    req = urllib.request.Request(self._airbrake_url,
                                 data=data,
                                 headers=self._airbrake_headers)

    try:
      import ipdb; ipdb.set_trace()
      resp = urllib.request.urlopen(req, timeout=5)
    except urllib.error.HTTPError as err:
      resp = err
    except Exception as err: # pylint: disable=broad-except
      notice['error'] = err
      logger.error(notice['error'])
      return notice

此方法被提交给 ThreadPoolExecutorpybrake 的源代码中。问题是,当我尝试 import 调用此函数的脚本时,我无法进入调试器。这是我尝试时看到的结果:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py shell
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import lucy_web.tests.test_airbrake

In [2]: ipdb>                                                                                                       
2018-05-31 11:52:14,155 - pybrake - ERROR - 
> /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/pybrake/notifier.py(119)send_notice_sync()
    118       import ipdb; ipdb.set_trace()
--> 119       resp = urllib.request.urlopen(req, timeout=5)
    120     except urllib.error.HTTPError as err:
ipdb> ^[ipdb>                                                                                                       
In [2]: 2018-05-31 11:52:14,159 - pybrake - ERROR - 

^[[37;1R> /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/venv/lib/python3.6/site-packages/pybrake/notifier.py(119)send_notice_sync()
    118       import ipdb; ipdb.set_trace()
--> 119       resp = urllib.request.urlopen(req, timeout=5)
    120     except urllib.error.HTTPError as err:
^[[37;1R
^[[37;1RIn [2]: dir()
In [2]: dir()
Out[2]: 
['In',
 'Out',
 '_',
 '__',
 '___',
 '__builtin__',
 '__builtins__',
 '__doc__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_dh',
 '_i',
 '_i1',
 '_i2',
 '_ih',
 '_ii',
 '_iii',
 '_oh',
 'exit',
 'get_ipython',
 'lucy_web',
 'quit']

因此,尽管调试器的输出有“闪烁”,但最终我只是在我原来的 ipdb session 的范围内结束。如何才能在 send_notice_sync() 方法中设置跟踪?

最佳答案

我最终通过在 Notifier__init__() 方法中闯入调试器解决了这个问题,该方法之所以有效是因为它不是异步调用的。在这里,我能够确定 project_id 作为 None 传入,因为我没有正确设置我的 Django AIRBRAKE 设置。

关于python - 无法在异步调用的函数中放入 Python 调试器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50631690/

相关文章:

python - 使用 easy_thumbnails_ffmpeg

Django Rest Framework 测试失败或通过,具体取决于函数数量

Django测验应用程序,REST,如何设计模型?

c# - 在调用异步函数后执行代码

python - 为什么不可用的密码在 Django 的用户身份验证中具有随机字符串?

python - 如何编写一个生成器,返回 Python 中 iterable 中的 ALL-BUT-LAST 项?

python - 处理速度 - 编辑大型 2GB 文本文件 python

python - 在 Windows 中将 python .py 作为服务启动

multithreading - 回调如何在非阻塞设计中工作?

c# - 在 WPF 中执行异步任务的推荐方法是什么?