Python:如何从程序中运行交互式Python shell

35
我经常会遇到这样的情况,我正在编写脚本,但是想要交互式地操作一些变量,需要运行已经写好的大部分脚本才能到达目标代码段。
在这种情况下,从shell里面运行程序并不是很容易。我需要想出一种方法来重新创建函数的条件。
我想做的是调用一个函数,比如runshell(),它将在程序中运行python shell,保留所有变量的作用域,让我可以自由地查看变量。
我该如何实现这个功能呢?

你是在谈论使用Python调试器吗?还是在寻求有关如何将大型脚本分解为更易管理的部分的设计建议? - S.Lott
我在询问之前的问题 - 我忘记了那个词(“debugger”)! - Claudiu
5个回答

57
import code

code.interact(local=locals())

但是使用Python调试器可能更适合你的需求:

import pdb

pdb.set_trace()

谢谢!我已经找了一段时间了!导入代码 - zx1986
如果您在PDB会话中的断点处,并且想要从那里进入交互式Python shell,则import code; code.interact(local=locals())非常适合。在该交互式shell中定义的变量和函数在按下^D并返回调试会话时可用。非常感谢,Michael Hoffman。 - Will Ware

23

到目前为止,我找到的最方便的方法是:

import IPython
IPython.embed()

您可以获得所有的全局和本地变量以及 IPython 的全部便利功能:tab 命令自动完成、自动缩进等。

当然,您必须安装 IPython 模块才能使用它:

pip install ipython

我喜欢这个,但有一个小问题。我必须重新做我的导入。有没有办法将导入传递到新的交互式 shell 中呢? - kdauria

6
为了方便起见,我想提醒您可以将调试器跟踪放在一行中:
import pdb; pdb.set_trace()

这是在支持代码片段的编辑器(如TextMate或Vim+SnipMate)中添加的一个不错的行。我已经将其设置为将“break”扩展为上面的一行代码。


是的,这确实是我现在经常做的事情。 - Claudiu

5
你可以使用Python调试器(pdb)的set_trace函数。
例如,如果你像这样调用一个脚本:
def whatever():
    x = 3
    import pdb
    pdb.set_trace()

if __name__ == '__main__':
    whatever()

当调用`set_trace`时,您会在该点获得作用域:
$ python ~/test/test.py
--Return--
> /home/jterrace/test/test.py(52)whatever()->None
-> pdb.set_trace()
(Pdb) x
3
(Pdb) 

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接