如何在程序中启动Python控制台(便于调试)?

6 投票
6 回答
2809 浏览
提问于 2025-04-16 08:54

经过多年在Matlab中进行研究编程,我很怀念那种可以在程序运行到一半时暂停,然后检查变量、绘图、保存或修改数据等操作的方式,这些都是通过交互式控制台完成的,然后再继续执行程序。

在Python中有没有办法做到类似的事情呢?

比如说:


   # ... python code ...
   RunInterpreter
   # Interactive console is displayed, so user can inspect local/global variables
   # User types CTRL-D to exit, and script then continues to run
   # ... more python code ...

这样调试起来会简单很多。非常感谢大家的建议!

6 个回答

3

code模块里有一些类,可以用来启动一个交互式的命令行环境,也就是我们常说的REPL(读-求-打印-循环)。

6

使用 pdb 库。

我在 Vim 中把这一行绑定到了 <F8> 键:

import pdb; pdb.set_trace()

这样就可以进入 pdb 控制台了。

pdb 控制台和标准的 Python 控制台不完全一样……但大部分功能是相似的。此外,在我的 ~/.pdbrc 文件中,我设置了:

alias i from IPython.Shell import IPShellEmbed as IPSh; IPSh(argv='')()

这样我就可以通过 pdb 里的 i 命令进入一个“真正的” iPython 环境:

(pdb) i
...
In [1]:
5

我找到的一个很棒的解决办法是使用'code'模块。现在我可以在代码的任何地方调用'DebugKeyboard()',这样就会弹出一个解释器提示框,让我可以查看变量和运行代码。按下CTRL-D就可以继续程序的运行。

import code
import sys    

def DebugKeyboard(banner="Debugger started (CTRL-D to quit)"):

    # use exception trick to pick up the current frame
    try:
        raise None
    except:
        frame = sys.exc_info()[2].tb_frame.f_back

    # evaluate commands in current namespace
    namespace = frame.f_globals.copy()
    namespace.update(frame.f_locals)

    print "START DEBUG"
    code.interact(banner=banner, local=namespace)
    print "END DEBUG"

撰写回答