python debugging pydev monkeypatching gevent

python - gevent parches de mono y puntos de interrupción



debugging pydev (4)

Actualmente uso Pycharm 2.7.3 y también tuve problemas con gevent 0.13.8 rompiendo la depuración. Sin embargo, cuando actualicé a gevent 1.0rc3 encontré que podía depurar de nuevo correctamente.

Nota al margen:

Acabo de enterarme de que Jetbrains tenía una solución alternativa con el indicador de configuración. Estaba resolviendo el problema cuando necesitaba depurar con el siguiente truco. Sinceramente, no sé por qué funcionó ni cuáles fueron las consecuencias negativas. Acabo de hacer una pequeña prueba y error, y esto sucedió para permitir que la depuración funcionara cuando utilizaba grequests.

# overrides the monkeypatch issue which causes debugging in PyDev to not work. def patch_time(): return import gevent.monkey gevent.monkey.patch_time = patch_time import grequests

He estado jugando con Gevent, y me gusta mucho. Sin embargo me he encontrado con un problema. No se están alcanzando los puntos de interrupción, y la depuración no funciona (con las herramientas Visual Studio Python Tools y Eclipse PyDev). Esto sucede después de que se llama a monkey.patch_all() .

Este es un gran problema para mí y, desafortunadamente, es un bloqueador para el uso de gevent. He encontrado algunos hilos que parecen indicar que gevent rompe la depuración, pero me imagino que hay una solución para eso.

¿Alguien sabe cómo hacer que la depuración y los puntos de interrupción funcionen con los parches de gevent y monkey?


La solución más simple y peligrosa sería hacer un parche stdin y stdout:

import gevent.monkey gevent.monkey.patch_all(sys=True) def my_app(): # ... some code here import pdb pdb.set_trace() # ... some more code here my_app()

Esto es bastante peligroso ya que corres el riesgo de que stdin / stdout se comporte de una manera extraña durante el resto de la vida de tu aplicación.

En su lugar, puedes usar una biblioteca que escribí: gtools.pdb . Se minimiza el riesgo para el indicador de pdb solamente:

def my_app(): # ... some code here import gtools.pdb gtools.pdb.set_trace() # ... some more code here my_app()

Básicamente, lo que hace es decirle a pdb que use un stdin y stdout no bloqueantes para su indicador interactivo. Todos los greenlets en ejecución continuarán ejecutándose en segundo plano.

Si quieres evitar la dependencia, todo lo que necesitas hacer es decirle a pdb que use un stdin y stdout amigable con gevent con algo como esto:

import sys from gevent.fileobject import FileObjectThread as File def Pdb(): import pdb return pdb.Pdb(stdin=File(sys.stdin), stdout=File(sys.stdout)) def my_app(): # ... some code here Pdb().set_trace() # ... some more code here my_app()

Tenga en cuenta que con cualquiera de estas soluciones, perderá las instalaciones del sistema de pdb Key-up, Key-down, ver el problema de gevent parcheando stdin / stdout .


PyCharm IDE resuelve el problema. Admite la depuración de código gevent después de establecer un indicador de configuración: http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/ .

Desafortunadamente, en este momento no conozco una herramienta gratuita capaz de depurar gevent.

UPD: ¡HAY! Ahora hay una versión comunitaria de PyCharm.