我尝试调试一个简单的python应用程序,但迄今为止没有运气。
import multiprocessing
def worker(num):
for a in range(0, 10):
print a
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
我想在for循环中设置一个断点来跟踪'a'的值,但是我尝试过的工具都不能做到这一点。到目前为止,我试着用以下工具调试:
- PyCharm,并得到以下错误:导入错误:没有名为pydevd -http://youtrack.jetbrains.com/issue/PY-6649的模块,看起来他们仍在修复此问题,据我所知,没有关于此问题的ETA
- 我还尝试使用Winpdb -http://winpdb.org进行调试,但它无法进入我的“worker”方法,而只是打印“a”的值
我真的会很感激任何帮助与此!
7条答案
按热度按时间xsuvu9jc1#
我发现在设置断点时用
threading.Thread()
替换multiprocessing.Process()
非常有用。这两个类有相似的参数,所以在大多数情况下它们是可以互换的。通常我的脚本使用
Process()
,直到我指定命令行参数--debug
,它有效地将那些调用替换为Thread()
。这允许我使用pdb
调试那些脚本。dbf7pr2w2#
您应该能够使用remote-pdb来完成此操作。
然后,只需telnet到日志中列出的端口。
示例:
第一个
或
此时,您应该能够调试该进程。
siv3szwd3#
在调试Python代码时,我很少需要使用传统的调试器,而是更喜欢在代码中大量使用trace语句。我会将您的代码更改为以下代码:
在实际执行中,您可以将追踪层级设定为logging.WARNING,停用两柴追踪陈述式,这样您就只会记录警告和错误。
在Python官方网站上有一个很好的基础和高级日志教程。
1tu0hz3e4#
我将
/Applications/PyCharm\ 2.6\ EAP.app/helpers/pydev/*.py
中的所有内容复制到我的virtualenv中的site-packages
,它对我的工作正常(我正在调试celery/kombu,断点按预期工作)。cl25kdpy5#
如果常规的pdb/ipdb能够与多处理一起工作,那就太好了。如果我可以摆脱它,那么如果配置的进程数为1,我将串行处理对多处理的调用。
然后在调试时,将应用程序配置为只使用一个进程。这并不能涵盖所有情况,尤其是在处理并发问题时,但这可能会有所帮助。
mzsu5hc06#
如果您尝试调试同时运行的多个进程,如示例所示,那么没有明显的方法可以从单个终端完成此操作:哪个进程应该获得键盘输入?因此,Python总是将子进程中的
sys.stdin
连接到os.devnull
。但这意味着,当调试器试图从stdin获得输入时,它会立即到达文件结尾并报告错误。如果您可以限制自己一次只能运行一个子进程,至少在调试时是这样,那么您可以通过设置
sys.stdin = open(0)
重新打开主stdin来解决这个问题,如here所述。但是如果多个子进程同时处于断点,那么您将需要一个不同的解决方案,因为它们最终都会争夺来自单个终端的输入。在这种情况下,
RemotePdb
可能是您最好的选择,正如@OnionKnight所描述的那样。xzabzqsa7#
WingIDE Pro提供了开箱即用的功能。
无其他代码(例如,使用
traceback
模块)。您只需运行您的程序,Wing调试器不仅会从子进程打印stdout
,而且会在子进程出错时中断,立即创建一个交互式shell,以便您可以调试出错的线程。没有比这更容易的了,而且据我所知没有其他IDE以这种方式公开子进程。是的,这是一个商业产品。但是我还没有找到任何其他的IDE提供调试器来匹配。PyCharm Professional,Visual Studio Community,Komodo IDE --我都试过了。在我看来,WingIDE在解析源文档方面也很领先。而Eye Ease绿色配色方案是我现在不能没有的。
(Yes我知道这个问题已经问了5年多了,但我还是要回答。)