gevent猴子修补和断点

时间:2012-07-15 20:27:49

标签: python debugging pydev monkeypatching gevent

我一直在玩Gevent,我非常喜欢它。但是我遇到了一个问题。断点没有被击中,调试也不起作用(使用Visual Studio Python工具和Eclipse PyDev)。这在monkey.patch_all()被调用后发生。

这对我来说是一个大问题,不幸的是,这是使用gevent的阻碍。我发现few threads似乎表明gevent打破了调试,但我想有一个解决方案。

有谁知道如何使调试和断点适用于gevent和monkey补丁?

4 个答案:

答案 0 :(得分:9)

PyCharm IDE解决了这个问题。它在您设置配置标志后支持gevent代码调试:http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/

不幸的是,目前我还不知道能够调试gevent的免费工具。

UPD:有!现在有一个社区版的PyCharm。

答案 1 :(得分:4)

pdb - The Python Debugger

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

答案 2 :(得分:1)

最简单,最危险的解决方案是使用补丁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()

这非常危险,因为你冒着stdin / stdout以奇怪的方式行事的风险 在您的应用生命周期的剩余时间。

相反,你可以使用我写的库:gtools.pdb。它最小化 仅对pdb提示符的风险:

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

    import gtools.pdb
    gtools.pdb.set_trace()

    # ... some more code here

my_app()

基本上,它的作用是告诉pdb使用非阻塞stdin和stdout 它的互动提示。任何正在运行的greenlet仍将继续运行 在后台。

如果你想避免依赖,你需要做的就是告诉pdb使用 一个gevent友好的stdin和stdout用这样的东西:

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提示设施see gevent issue patching stdin/stdout

答案 3 :(得分:0)

我目前使用Pycharm 2.7.3,而且我也遇到了gevent 0.13.8破解调试的问题。但是当我更新到gevent 1.0rc3时,我发现我可以再次正确调试。


旁注:

我刚刚才知道Jetbrains有一个配置标志的解决方法。当我需要使用以下hack进行调试时,我遇到了问题。老实说,我不知道它为什么会起作用,也不知道负面后果是什么。我只是做了一些试验和错误,这恰好允许调试在使用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
相关问题