有没有办法连接到正在运行的Python脚本以查看情况?
我有一个Python脚本,有时候会卡住,我想知道为什么会这样。有没有办法可以监控这个Python脚本,看看它的变量是什么,当前在执行哪一行,或者它正在做什么?
3 个回答
是的,有几种方法可以调试Python脚本,以找出偶尔卡顿的原因。下面是一些常见的技巧:
打印语句: 在代码的不同地方插入打印语句,这样可以打印出变量的值和程序的执行流程。这是一种简单快捷的方法,可以让你了解脚本在做什么。 print("到达A点") print(变量名)
日志记录: 使用
logging
模块在脚本的不同地方记录信息(比如信息、调试、错误等)。这样可以提供比打印语句更详细的信息。import logging logging.basicConfig(level=logging.DEBUG) logging.debug("这是一个调试信息")
交互式调试器(PDB): 你可以使用Python自带的调试器PDB(Python Debugger),逐步执行代码并交互式检查变量。在你想开始调试的地方插入以下代码:
import pdb; pdb.set_trace()
运行你的脚本,它会在这一行停下来,让你检查变量、逐步执行代码,找出问题。
追踪:
trace
模块可以让你追踪代码的执行过程,显示哪些行被执行以及执行的顺序。import trace tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix], trace=1) tracer.run('your_script.py') 这会生成一个报告,你可以查看函数调用的顺序和执行的行。
然后你可以把import pdb; pdb.set_trace()
替换成import pdbpp; pdbpp.set_trace()
或者import ipdb; ipdb.set_trace()
,这样可以获得更多功能。
选择最适合你需求的方法,或者结合多种技巧进行更全面的调试。
对于那些没有提前准备好的二进制文件的情况:
- pydbattach,这是我自己拼凑出来的,已经很久没有更新了
- Google pyringe,最后一次更新是在2014年
- pyrasite,最后一次更新是在2017年
- py-spy,只进行采样,可以导出堆栈跟踪信息
- Pyflame,也只是进行采样
- PyStack,可以导出堆栈跟踪信息,包括局部变量
原始回答
可以使用调试工具,具体方法可以参考如何将远程调试器连接到Python进程?中的回答。
连接后,你可以暂停程序的运行,查看变量、当前的调用栈等信息……
更新
正如评论中提到的,链接中的调试工具似乎需要以特定的方式启动进程。安装了Python工具的Visual Studio确实支持连接到正在运行的进程。