在Python中输入交互模式

时间:2012-11-17 17:04:34

标签: python interactive

我正在运行我的Python程序,并且有一个重点是跳入并查看正在发生的事情,然后再次退出。有点像临时控制台模式。

在Matlab中,我使用keyboard命令来执行此操作,但我不确定python中的命令是什么。

有办法做到这一点吗?

例如:

for thing in set_of_things:
    enter_interactive_mode_here()
    do_stuff_to(thing)

enter_interactive_mode()来电时,我想去那里,环顾四周,然后离开并让程序继续运行。

8 个答案:

答案 0 :(得分:51)

code.interact()似乎以某种方式起作用:

>>> import code
>>> def foo():
...     a = 10
...     code.interact(local=locals())
...     return a
... 
>>> foo()
Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10

Ctrl + Z 返回“主”解释器。

您可以阅读本地人,但修改它们似乎不会这样。

答案 1 :(得分:45)

python -i myapp.py

这将执行myapp.py并将您放入交互式shell中。从那里你可以执行函数并检查它们的输出,加载myapp.py的整个环境(导入等)。

对于更复杂的东西 - 最好使用像pdb这样的调试器来设置断点。此外,大多数IDE(PyDev,PyCharm,Komodo ......)都有图形化调试器。

答案 2 :(得分:17)

我为此目的使用pdb。我意识到埃米尔已经在他的回答中提到了这一点,但他没有提供一个例子或详细说明为什么它会回答你的问题。

for thing in set_of_things:
    import pdb; pdb.set_trace()
    do_stuff_to(thing)

您可以通过使用感叹号启动命令来读取和设置变量。您还可以在堆栈中上下移动(命令ud),InteractiveConsole没有内置机制。

要让程序继续执行,请使用c命令。在上面的示例中,它将在每次循环迭代时进入调试器,因此您可能希望将set_trace()调用包装在if句中。

答案 3 :(得分:10)

你有选择 - Python标准库或IPython。

Python标准库有一个code模块,它有一个InteractiveConsole类,其目的是“密切模拟交互式Python解释器的行为”。这可能会做你想要的,但文档没有任何关于如何使用它的例子,我没有任何关于去哪里的建议。

IPython,这是一个更高级的Python终端,可以选择在你内置的程序中的任何一点嵌入一个控制台。根据他们的documentation,你可以简单地做到

from IPython import embed

for thing in set_of_things:
  embed()
  do_stuff_to(thing)

答案 4 :(得分:4)

最适合我的工具是ipdb

  

ipdb导出函数以访问IPython调试器,该调试器具有选项卡完成,语法突出显示,更好的回溯,使用与pdb模块相同的接口更好的内省。

完成和方便的内省对于调试特别有用。

答案 5 :(得分:3)

您可以使用ipdb

  

要设置断点,请将import ipdb; ipdb.set_trace()添加到要跳转到调试器的位置。一旦到达断点,您将获得一个交互式shell和断点周围的几行代码以供上下文使用。

     

https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/

答案 6 :(得分:0)

虽然它可能不是最合适的选择,但有些简单:

try:
    while True:
        print input()
except:
    pass

将涵盖许多案例

答案 7 :(得分:0)

从Python 3.7开始,您还可以使用breakpoint()进入调试器,例如:

for thing in set_of_things:
    breakpoint()
    do_stuff_to(thing)

这更容易记住和编写,并且默认情况下会在pdb中打开您的代码。

但是,也可以将PYTHONBREAKPOINT环境设置为可调用的名称,该环境可以是诸如pudbipdb之类的另一个调试器,也可以是IPython的{{ 1}}或其他任何内容。