【问题标题】:Embed (create) an interactive Python shell inside a Python program在 Python 程序中嵌入(创建)交互式 Python shell
【发布时间】:2011-04-08 16:08:46
【问题描述】:

是否可以在 Python 程序中启动交互式 Python shell?

我想使用这样一个交互式 Python shell(在我的程序执行内部运行)来检查一些程序内部变量。

【问题讨论】:

  • 您可以使用 pdb、IDE 调试器或 print

标签: python


【解决方案1】:

code 模块提供了一个交互式控制台:

import readline # optional, will allow Up/Down/History in the console
import code
variables = globals().copy()
variables.update(locals())
shell = code.InteractiveConsole(variables)
shell.interact()

【讨论】:

  • 请注意,vars 是一个内置函数。此外,在 Python 3.5+ 中,您可以使用字典扩展从两个现有字典创建“复合”字典:variables = {**globals(), **locals()}
  • @kyrill 修复了前一点。由于仍然有大量 Python
  • 是否可以在 PyQt5 的小部件中包装或封装交互式控制台?
  • @Ash 这听起来是个好问题(尽管您可能只需要 一个 交互式控制台,不一定需要这个特定模块)。继续ask it
  • @phihag: readline 似乎不存在了。 up/down/history 功能是否仍然可以通过某些标准库获得?
【解决方案2】:

在 ipython 0.13+ 中你需要这样做:

from IPython import embed

embed()

【讨论】:

    【解决方案3】:

    这段代码我用了很久了,希望你能用起来。

    要检查/使用变量,只需将它们放入当前命名空间即可。例如,我可以从命令行访问var1var2

    var1 = 5
    var2 = "Mike"
    # Credit to effbot.org/librarybook/code.htm for loading variables into current namespace
    def keyboard(banner=None):
        import code, sys
    
        # use exception trick to pick up the current frame
        try:
            raise None
        except:
            frame = sys.exc_info()[2].tb_frame.f_back
    
        # evaluate commands in current namespace
        namespace = frame.f_globals.copy()
        namespace.update(frame.f_locals)
    
        code.interact(banner=banner, local=namespace)
    
    
    if __name__ == '__main__':
      keyboard()
    

    但是如果您想严格调试您的应用程序,我强烈建议使用 IDE 或pdb(python debugger)

    【讨论】:

      【解决方案4】:

      使用 IPython,您只需调用:

      from IPython.Shell import IPShellEmbed; IPShellEmbed()()
      

      【讨论】:

      • 其实你应该使用import IPython; IPython.embed();。见this issue
      • 是的,这也是我今天使用的,3 年后 =)
      【解决方案5】:

      另一个技巧(除了已经建议的)是打开一个交互式 shell 并导入您的(可能已修改的)python 脚本。导入后,大多数变量、函数、类等(取决于整个事物的准备方式)都可用,您甚至可以从命令行交互地创建对象。所以,如果你有一个test.py 文件,你可以打开 Idle 或其他 shell,然后输入 import test(如果它在当前工作目录中)。

      【讨论】:

      • 将脚本的全局变量放在全局命名空间而不是模块命名空间的类似方法:exec(open("test.py").read())
      猜你喜欢
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2016-04-05
      • 2011-07-24
      • 2020-05-27
      • 2016-05-29
      • 2011-09-01
      • 2020-08-15
      相关资源
      最近更新 更多