pycharm Python多进程调试

hrysbysz  于 2022-11-08  发布在  PyCharm
关注(0)|答案(7)|浏览(736)

我尝试调试一个简单的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”的值

我真的会很感激任何帮助与此!

xsuvu9jc

xsuvu9jc1#

我发现在设置断点时用threading.Thread()替换multiprocessing.Process()非常有用。这两个类有相似的参数,所以在大多数情况下它们是可以互换的。
通常我的脚本使用Process(),直到我指定命令行参数--debug,它有效地将那些调用替换为Thread()。这允许我使用pdb调试那些脚本。

dbf7pr2w

dbf7pr2w2#

您应该能够使用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到日志中列出的端口。
示例:
第一个

nc -tC 127.0.0.1 54273

-> s = thing * 2
(Pdb)

此时,您应该能够调试该进程。

siv3szwd

siv3szwd3#

在调试Python代码时,我很少需要使用传统的调试器,而是更喜欢在代码中大量使用trace语句。我会将您的代码更改为以下代码:

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官方网站上有一个很好的基础和高级日志教程。

1tu0hz3e

1tu0hz3e4#

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

cl25kdpy

cl25kdpy5#

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

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

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

mzsu5hc0

mzsu5hc06#

如果您尝试调试同时运行的多个进程,如示例所示,那么没有明显的方法可以从单个终端完成此操作:哪个进程应该获得键盘输入?因此,Python总是将子进程中的sys.stdin连接到os.devnull。但这意味着,当调试器试图从stdin获得输入时,它会立即到达文件结尾并报告错误。
如果您可以限制自己一次只能运行一个子进程,至少在调试时是这样,那么您可以通过设置sys.stdin = open(0)重新打开主stdin来解决这个问题,如here所述。
但是如果多个子进程同时处于断点,那么您将需要一个不同的解决方案,因为它们最终都会争夺来自单个终端的输入。在这种情况下,RemotePdb可能是您最好的选择,正如@OnionKnight所描述的那样。

xzabzqsa

xzabzqsa7#

WingIDE Pro提供了开箱即用的功能。
无其他代码(例如,使用traceback模块)。您只需运行您的程序,Wing调试器不仅会从子进程打印stdout,而且会在子进程出错时中断,立即创建一个交互式shell,以便您可以调试出错的线程。没有比这更容易的了,而且据我所知没有其他IDE以这种方式公开子进程。
是的,这是一个商业产品。但是我还没有找到任何其他的IDE提供调试器来匹配。PyCharm Professional,Visual Studio Community,Komodo IDE --我都试过了。在我看来,WingIDE在解析源文档方面也很领先。而Eye Ease绿色配色方案是我现在不能没有的。
(Yes我知道这个问题已经问了5年多了,但我还是要回答。)

相关问题