bar*_*ley 7 python debugging multiprocessing pycharm winpdb
我正在尝试调试一个简单的 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()
Run Code Online (Sandbox Code Playgroud)
我想在 for 循环中设置一个断点来跟踪 'a' 的值,但我尝试过的工具都无法做到这一点。到目前为止,我尝试使用以下方法进行调试:
我真的很感激任何帮助!
我发现当我要设置断点时替换multiprocessing.Process()为非常有用。threading.Thread()这两个类都有相似的参数,因此在大多数情况下它们是可以互换的。
通常我的脚本会一直使用,Process()直到我指定命令行参数为止--debug,该参数有效地将这些调用替换为Thread(). 这使我可以使用pdb.
小智 7
你应该能够做到这一点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']))
Run Code Online (Sandbox Code Playgroud)
然后就telnet到日志中列出的端口。
例子:
RemotePdb session open at 127.0.0.1:54273, waiting for connection ...
Run Code Online (Sandbox Code Playgroud)
telnet 127.0.0.1 54273
<telnet junk>
-> s = thing*2
(Pdb)
Run Code Online (Sandbox Code Playgroud)
或者
nc -tC 127.0.0.1 54273
-> s = thing * 2
(Pdb)
Run Code Online (Sandbox Code Playgroud)
此时您应该能够调试该过程。
在尝试调试 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()
Run Code Online (Sandbox Code Playgroud)
在生产中,您可以通过将跟踪级别设置为logging.WARNING来禁用调试跟踪语句,这样您就只记录警告和错误。
Python 官方网站上有一个很好的基础和高级日志记录教程。
| 归档时间: |
|
| 查看次数: |
10240 次 |
| 最近记录: |