gevent исправление обезьян и точки останова

Я играю с Gevent, и мне это очень нравится. Однако я столкнулся с проблемой. Точка останова не срабатывает, и отладка не работает (с использованием инструментов Python для Visual Studio и Eclipse PyDev). Это происходит после вызова monkey.patch_all().

Для меня это большая проблема, и к сожалению это блокировщик использования gevent. Я нашел несколько тем, которые, кажется, указывают на то, что gevent прерывает отладку, но я бы представьте, что есть решение для этого.

Кто-нибудь знает, как заставить работать отладку и точки останова с исправлением gevent и monkey?


person Flavien    schedule 15.07.2012    source источник
comment
Ну почему не использовать печать, как мы в 80-х? Хотя это не совсем то, что вы ищете, это может помочь исправить одну или две ошибки.   -  person Moonwalker    schedule 04.08.2012


Ответы (4)


PyCharm IDE решает проблему. Он поддерживает отладку кода gevent после установки флага конфигурации: http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/.

К сожалению, на данный момент я не знаю бесплатного инструмента, способного отлаживать gevent.

UPD: ЕСТЬ! Теперь есть версия сообщества PyCharm.

person Ellioh    schedule 26.12.2012
comment
Потому что даже спустя год или около того эти темы все еще полезны... Теперь Jetbrains предлагает бесплатную версию Pycharm для сообщества -- jetbrains.com/pycharm/download/index.html - person Marcel Wilson; 01.11.2013

pdb — отладчик Python

import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.
person Jason    schedule 14.08.2012

Самым простым и самым опасным решением было бы исправление ошибок stdin и 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()

Это довольно опасно, так как вы рискуете вести себя странным образом в течение оставшейся части жизни вашего приложения.

Вместо этого вы можете использовать библиотеку, которую я написал: gtools.pdb. Это сводит к минимуму риск только для подсказки pdb:

def my_app():
    # ... some code here

    import gtools.pdb
    gtools.pdb.set_trace()

    # ... some more code here

my_app()

По сути, он указывает pdb использовать неблокирующий стандартный ввод и стандартный вывод для своей интерактивной подсказки. Любые работающие гринлеты будут по-прежнему работать в фоновом режиме.

Если вы хотите избежать зависимости, все, что вам нужно сделать, это указать pdb использовать стандартный ввод и стандартный вывод, совместимые с gevent, с чем-то вроде этого:

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()

Обратите внимание, что с любым из этих решений вы теряете средства подсказок Key-up, Key-down pdb см. gevent проблема с исправлением stdin/stdout.

person Tiago Coutinho    schedule 17.03.2018

В настоящее время я использую Pycharm 2.7.3, и у меня тоже были проблемы с отладкой gevent 0.13.8. Однако, когда я обновился до gevent 1.0rc3, я обнаружил, что могу снова правильно отлаживать.


Примечание:

Только сейчас я узнал, что у Jetbrains есть обходной путь с флагом конфигурации. Я пытался обойти проблему, когда мне нужно было выполнить отладку с помощью следующего хака. Честно говоря, я не знаю, почему это сработало и каковы были негативные последствия. Я просто провел небольшой пробный и ошибочный эксперимент, и это позволило отладке работать при использовании 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
person Marcel Wilson    schedule 01.11.2013