我有一个使用C库的django应用程序(通过swig导入)。C库启动自己的线程,该线程在Python代码中调用回调。
我不能在Python代码中设置断点,无论是在PyDev还是PyCharm中。也尝试了“gevent兼容性”选项,但没有成功。
我验证了回调是正确调用的,因为logging.info转储了预期的内容。在其他线程中设置的断点工作正常。所以看起来python调试器无法管理python代码中的断点,这些断点是由非python代码中创建的线程调用的。
有谁知道变通办法吗?也许有一些'魔术'线程初始化序列,我可以使用?
2条答案
按热度按时间l7wslrjt1#
您必须设置调试器机制,使其在非Python线程上工作(这是在创建Python线程时自动完成的,但是当你创建一个Python没有任何创建钩子的线程时,你必须自己做)--注意,对于一些框架--比如QThread/Gevent --事情是猴子补丁,这样我们就知道初始化并启动调试器,但对于其他框架,您必须自己完成。
要做到这一点,在启动线程后,你必须调用:
请注意,如果您输入了
suspend=True
,它将模拟一个手动断点,并将在代码的该点处停止。对于现实世界的情况,如果你有一个回调函数,并且只有当前脚本中的那个函数被另一个程序(比如C++)中的另一个线程调用,那么你必须把调用放在函数内部,而不是在
import
语句之后调用它。关于example in PyTorchlbsnaicq2#
这是@fabio-zadrozny回答的后续。
下面是我创建的一个mixin,我的类(从C线程获取回调)继承了它。