繁体   English   中英

在 Python 中进入交互模式

[英]Enter Interactive Mode In Python

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

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

有没有办法做到这一点?

例如:

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

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

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

你可以阅读当地人,但修改他们似乎并没有这样工作。

python -i myapp.py

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

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

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

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

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

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

您有多种选择——Python 标准库或 IPython。

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

IPython是一个更高级的 Python 终端,可以选择在内置程序的任何位置嵌入控制台。根据他们的文档,您可以简单地做

from IPython import embed

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

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

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

这样更容易记忆和编写,默认情况下会在 pdb 中打开你的代码。

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

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

ipdb 导出函数以访问 IPython 调试器,它具有制表符完成、语法突出显示、更好的回溯、更好的内省功能,与 pdb 模块具有相同的接口。

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

您可以使用ipdb

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

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

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

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

将涵盖许多案件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM