在pycharm或eclipse + pydev

时间:2015-12-15 20:47:19

标签: eclipse multithreading debugging pycharm pydev

我有一个使用C ++库的django应用程序(通过swig导入)。 C ++库启动自己的线程,该线程在Python代码中调用回调。

我无法在python代码中设置断点,也不能在PyDev和PyCharm中设置断点。 也试过'gevent compatibility'选项也没有运气。

我验证了回调被正确调用,因为logging.info转储了预期的内容。在其他线程中设置的断点工作正常。因此,似乎python调试器无法管理在非python代码中创建的线程调用的python代码中的断点。

有没有人知道解决方法?也许我可以使用一些“魔术”线程初始化序列?

2 个答案:

答案 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'
);