我有一个使用C ++库的django应用程序(通过swig导入)。 C ++库启动自己的线程,该线程在Python代码中调用回调。
我无法在python代码中设置断点,也不能在PyDev和PyCharm中设置断点。 也试过'gevent compatibility'选项也没有运气。
我验证了回调被正确调用,因为logging.info转储了预期的内容。在其他线程中设置的断点工作正常。因此,似乎python调试器无法管理在非python代码中创建的线程调用的python代码中的断点。
有没有人知道解决方法?也许我可以使用一些“魔术”线程初始化序列?
答案 0 :(得分:10)
你必须设置调试器机制才能在非python线程上工作(这是在创建Python线程时自动完成的,但是当你创建一个Python没有任何创建钩子的线程时,你有自己动手) - 请注意,对于某些框架 - 例如QThread / Gevent - 会对猴子进行修补,以便我们了解初始化并启动调试器,但对于其他框架,您必须自己完成。
要做到这一点,在启动线程后你必须调用:
import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)
请注意,如果你放了suspend=True
,它会模拟一个手动断点并停在代码的那一点。
答案 1 :(得分:2)
这是@ fabio-zadrozny回答的后续行动。
这是我创建的mixin,我的类(从C线程获取回调)继承自。
jQuery.validator.addMethod('phoneUK', function(phone_number, element) {
return this.optional(element) || phone_number.length > 9 &&
phone_number.match(/^(\(?(0|\+44)[1-9]{1}\d{1,4}?\)?\s?\d{3,4}\s?\d{3,4})$/);
}, 'Please specify a valid phone number'
);