【问题标题】:Enter Interactive Mode In Python在 Python 中进入交互模式
【发布时间】:2012-11-06 03:07:45
【问题描述】:

我正在运行我的 Python 程序,并且有一点需要进入并查看发生了什么,然后再次退出。有点像临时控制台模式。

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

有没有办法做到这一点?

例如:

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

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

【问题讨论】:

  • 查看code.InteractiveInterpreter 类,然后总是有exec
  • 你不能在你的IDE中使用断点吗?

标签: python interactive


【解决方案1】:
python -i myapp.py

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

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

【讨论】:

  • 恐怕这不能回答我的问题。在“myapp.py”执行完成后,这将进入交互模式;我想在“myapp.py”执行期间进入交互模式。
  • 您可以选择使用调试器,或者创建一个脚本来执行到您感兴趣的点。从那里你可以调用一个函数来“恢复”你的程序。
【解决方案2】:

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 返回“主”解释器。

您可以阅读本地人,但修改它们似乎并没有这种方式。

【讨论】:

  • 在 IDLE 中,由于 Ctrl+Z 返回主解释器而不是程序,这实际上并不比 sys.exit() 更好。
  • 另一个答案有一个带有 code.InteractiveConsole.interact() 的示例,它似乎效果更好-它使用 readline 并具有制表符完成功能。 (stackoverflow.com/questions/50917938/…)。 Ctrl+D 退出交互会话。
  • CTRL-Z 将作业置于后台
【解决方案3】:

您可以选择——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】:

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

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

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

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

    【讨论】:

    • 所以基本上set_trace 将控制权交给了键盘。
    【解决方案5】:

    对我来说最舒服的工具是ipdb

    ipdb 导出函数以访问 IPython 调试器,该调试器具有选项卡补全、语法突出显示、更好的回溯、更好的自省功能,与 pdb 模块具有相同的界面。

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

    【讨论】:

      【解决方案6】:

      您可以使用ipdb

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

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

      【讨论】:

      • 更好的答案,因为您可以访问局部变量
      【解决方案7】:

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

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

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

      但是,也可以将PYTHONBREAKPOINT 环境设置为可调用的名称,它可以是另一个调试器,例如pudbipdb,也可以是IPython 的embed,或其他任何东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 2016-04-05
        • 2011-05-31
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        相关资源
        最近更新 更多