9

我正在尝试调试一个简单的 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 并收到以下错误:ImportError: No module named pydevd - http://youtrack.jetbrains.com/issue/PY-6649看起来他们仍在努力解决这个问题,据我所知,没有 ETA这个
  • 我还尝试使用 Winpdb 进行调试 - http://winpdb.org但它根本不会进入我的“worker”方法而只是打印“a”的值

我真的很感激这方面的任何帮助!

4

6 回答 6

5

我发现当我要设置断点时multiprocessing.Process()替换它非常有用。threading.Thread()两个类都有相似的论点,所以在大多数情况下它们是可以互换的。

通常我的脚本会使用Process(),直到我指定命令行参数--debug,该参数有效地将这些调用替换为Thread(). 这允许我使用pdb.

于 2020-07-24T08:50:32.293 回答
2

在尝试调试 Python 代码时,我很少需要使用传统的调试器,而是更喜欢随意地在我的代码中添加跟踪语句。我会将您的代码更改为以下内容:

import multiprocessing
import logging

def worker(num):
    for a in range(0, 10):
        logging.debug("(%d, %d)" % (num, a))

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        logging.info("Starting process %d" % i)
        p.start()

在生产中,您可以通过将跟踪级别设置为 logging.WARNING 来禁用调试跟踪语句,这样您就只记录警告和错误。

Python 官方网站上有一个很好的基础高级日志教程。

于 2012-06-19T17:24:07.873 回答
2

我将所有内容复制/Applications/PyCharm\ 2.6\ EAP.app/helpers/pydev/*.pysite-packages我的 virtualenv 中,它对我有用(我正在调试 celery/kombu,断点按预期工作)。

于 2013-01-12T15:03:15.150 回答
2

如果常规 pdb/ipdb 可以与多处理一起使用,那就太好了。如果我能摆脱它,如果配置的进程数为 1,我会串行处理对多处理的调用。

if processes == 1:
    for record in data:
        worker_function(data)
else:
    pool.map(worker_function, data)

然后在调试时,将应用程序配置为仅使用单个进程。这并不涵盖所有情况,尤其是在处理并发问题时,但它可能会有所帮助。

于 2015-11-16T20:11:16.733 回答
1

您应该可以使用 remote-pdb 来做到这一点。

from multiprocessing import Pool


def test(thing):
  from remote_pdb import set_trace
  set_trace()
  s = thing*2
  print(s)
  return s



if __name__ == '__main__':
  with Pool(5) as p:
    print(p.map(test,['dog','cat','bird']))

然后只需 telnet 到日志中列出的端口。

例子:

RemotePdb session open at 127.0.0.1:54273, waiting for connection ...
telnet 127.0.0.1 54273
<telnet junk>
-> s = thing*2
(Pdb) 

或者

nc -tC 127.0.0.1 54273

-> s = thing * 2
(Pdb)

此时您应该能够调试该过程。

于 2020-09-24T18:28:36.713 回答
-1

WingIDE Pro 开箱即用地提供了此功能。

不需要额外的代码(例如,使用traceback模块)。您只需运行您的程序,Wing 调试器不仅会stdout从子进程打印,而且会中断子进程中的错误并立即创建一个交互式 shell,以便您可以调试有问题的线程。没有比这更容易的了,而且我知道没有其他 IDE 以这种方式公开子进程。

是的,它是一种商业产品。但是我还没有找到任何其他提供调试器来匹配的 IDE。PyCharm Professional、Visual Studio Community、Komodo IDE——我都试过了。在我看来,WingIDE 在解析源文档方面也处于领先地位。而 Eye Ease Green 配色方案是我现在离不开的东西。

(是的,我意识到这个问题已有 5 年以上的历史了。无论如何我都会回答它。)

于 2018-02-02T02:27:39.637 回答