我一直在玩Gevent,我非常喜欢它。但是我遇到了一个问题。断点没有被击中,调试也不起作用(使用Visual Studio Python工具和Eclipse PyDev)。这在monkey.patch_all()
被调用后发生。
这对我来说是一个大问题,不幸的是,这是使用gevent的阻碍。我发现few threads似乎表明gevent打破了调试,但我想有一个解决方案。
有谁知道如何使调试和断点适用于gevent和monkey补丁?
答案 0 :(得分:9)
PyCharm IDE解决了这个问题。它在您设置配置标志后支持gevent代码调试:http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/。
不幸的是,目前我还不知道能够调试gevent的免费工具。
UPD:有!现在有一个社区版的PyCharm。答案 1 :(得分:4)
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