在Python中输入交互模式

Ric*_*ard 49 python interactive

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

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

有没有办法做到这一点?

例如:

for thing in set_of_things:
    enter_interactive_mode_here()
    do_stuff_to(thing)
Run Code Online (Sandbox Code Playgroud)

enter_interactive_mode()电话,我想去那里,环顾四周,然后离开,并有计划继续运行.

Kos*_*Kos 54

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
Run Code Online (Sandbox Code Playgroud)

Ctrl+ Z返回"主"解释器.

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


Emi*_*nov 46

python -i myapp.py
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我担心这不能回答我的问题.在"myapp.py"完成执行后,这将进入交互模式; 我想在"myapp.py"的执行过程中进入交互模式. (3认同)

Lau*_*low 17

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

for thing in set_of_things:
    import pdb; pdb.set_trace()
    do_stuff_to(thing)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 所以基本上`set_trace`可以控制键盘. (2认同)

Sam*_*ann 10

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

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

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

from IPython import embed

for thing in set_of_things:
  embed()
  do_stuff_to(thing)
Run Code Online (Sandbox Code Playgroud)


Tom*_*ick 7

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

for thing in set_of_things:
    breakpoint()
    do_stuff_to(thing)
Run Code Online (Sandbox Code Playgroud)

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

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