我一直在和 Gevent 一起玩,我非常喜欢它。但是我遇到了一个问题。没有命中断点,并且调试不起作用(同时使用 Visual Studio Python 工具和 Eclipse PyDev)。这发生在monkey.patch_all()
被调用之后。
这对我来说是个大问题,不幸的是这是使用 gevent 的一个障碍。我发现了一些似乎表明 gevent 中断调试的线程,但我想有一个解决方案。
有谁知道如何使调试和断点与 gevent 和猴子补丁一起工作?
PyCharm IDE 解决了这个问题。设置配置标志后,它支持 gevent 代码调试:http: //blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/。
不幸的是,目前我不知道能够调试 gevent 的免费工具。
UPD:有!现在有一个社区版本的 PyCharm。
import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.
在 VS Code 中调试时,
我收到了这个错误:
似乎正在使用 gevent 猴子补丁。请设置环境变量:GEVENT_SUPPORT=True 以在调试器中启用 gevent 支持。
为此,在调试launch.json
设置中,我设置了以下内容:
"env": {
"GEVENT_SUPPORT": "True"
},
最简单、最危险的解决方案是修改标准输入和标准输出:
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 使用非阻塞标准输入和标准输出作为其交互式提示。任何正在运行的 greenlets 仍将继续在后台运行。
如果你想避免依赖,你需要做的就是告诉 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 issue patching stdin/stdout。
我目前使用 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