首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >gevent monkey-补丁和断点

gevent monkey-补丁和断点
EN

Stack Overflow用户
提问于 2012-07-16 04:27:49
回答 3查看 4.5K关注 0票数 19

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

这对我来说是一个大问题,不幸的是,这是一个使用gevent的拦截器。我发现了一个few threads,它似乎表明gevent中断了调试,但我想有一个解决方案。

有没有人知道如何让调试和断点与gevent和monkey一起工作?

EN

回答 3

Stack Overflow用户

发布于 2012-12-26 18:12:27

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

不幸的是,目前我还不知道有什么免费的工具可以调试gevent。

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

票数 9
EN

Stack Overflow用户

发布于 2012-08-15 06:17:32

pdb - The Python Debugger

代码语言:javascript
复制
import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.
票数 4
EN

Stack Overflow用户

发布于 2018-03-18 04:13:43

最简单、最危险的解决方案是用猴子补丁stdin和stdout:

代码语言:javascript
复制
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提示符的风险降至最低:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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()

请注意,使用这些解决方案中的任何一种,您都可以轻松地使用pdb提示键来提高see gevent issue patching stdin/stdout的效率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11495357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档