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.
import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.