【问题标题】:How to drop into REPL (Read, Eval, Print, Loop) from Python code如何从 Python 代码进入 REPL(读取、评估、打印、循环)
【发布时间】:2010-11-26 14:59:24
【问题描述】:

有没有办法以编程方式强制 Python 脚本在其执行过程中的任意点放入 REPL,即使脚本是从命令行启动的?

我正在编写一个快速而肮脏的绘图程序,我想从标准输入或文件中读取数据,绘制它,然后放入 REPL 以允许自定义绘图。

【问题讨论】:

    标签: python interactive


    【解决方案1】:

    我经常用这个:

    def interact():
        import code
        code.InteractiveConsole(locals=globals()).interact()
    

    【讨论】:

    • 你可以做的比这更简单:导入代码; code.interact(local=locals())
    • pdb内,可以使用interact
    【解决方案2】:

    您可以尝试使用 python 的交互选项:

    python -i program.py
    

    这将执行 program.py 中的代码,然后转到 REPL。您在 program.py 顶层定义或导入的任何内容都将可用。

    【讨论】:

    • 当你准备好切换到黑暗面时,ipython -i program.py 就在那里。
    【解决方案3】:

    您应该这样做(IPython > v0.11):

    import IPython
    IPython.embed()
    

    对于 IPython

    from IPython.Shell import IPShellEmbed
    
    ipshell = IPShellEmbed()
    
    ipshell() # this call anywhere in your program will start IPython
    

    您应该使用 Python REPL 的凯迪拉克 IPython。见http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

    来自文档:

    它也可以用于科学 计算它所在的情况 常见的需要做一些自动的, 计算密集型部分和 然后停下来查看数据、图表等。 打开一个 IPython 实例将给出 您完全访问您的数据和 功能,您可以恢复程序 完成后执行 互动部分(可能停止 稍后再重复一次,根据需要多次)。

    【讨论】:

    • IPython 很棒,但是如果 OP 想要一个只使用内置 Python 的解决方案,那么 Jason 的 code.InteractiveConsole() 解决方案就是你“应该”这样做的方式。 :-)
    • 这是唯一可以在我的代码中放置在任意位置时实际读取局部变量的方法
    【解决方案4】:

    您可以启动调试器:

    import pdb;pdb.set_trace() 
    

    不确定您想要 REPL 做什么,但调试器非常相似。

    【讨论】:

    • 我怀疑他想对正在运行的进程进行实时更改,就像 Lisp。
    • 有什么方法可以恢复执行启动你进入 pdb 的脚本吗?
    • 我倾向于在 VIM 中编写代码 sn-p 而不是 Python 保存它,然后执行 !python -i % 例如。或 pdb 。这是一个很好的用例。
    • 从Python 3.7开始可以调用breakpoint()内置函数达到同样的效果。
    【解决方案5】:

    要使用 iPython 和调试器的功能,您应该使用 ipdb

    你可以像pdb一样使用它,只是增加了:

    import ipdb
    ipdb.set_trace()
    

    【讨论】:

      【解决方案6】:

      我只是在我自己的一个脚本中做到了这一点(它在一个自动化框架内运行,这是一个巨大的 PITA 工具):

      x = 0 # exit loop counter
      while x == 0:
          user_input = raw_input("Please enter a command, or press q to quit: ")
          if user_input[0] == "q":
              x = 1
          else:
              try:
                  print eval(user_input)
              except:
                  print "I can't do that, Dave."
                  continue
      

      只要把它放在你想要断点的任何地方,你就可以使用与 python 解释器相同的语法检查状态(尽管它似乎不允许你进行模块导入)。 它不是很优雅,但不需要任何其他设置。

      【讨论】:

        【解决方案7】:

        上面的答案很好,但如果您想在 IDE 中使用此功能。将Visual Studio Code (v1.5.*) 与Python Setup 一起使用:

        1. 突出显示您要运行的行并
        • right click 并从下拉列表中选择 Run Selection/Line in Interactive Window
        • 按键盘上的shift + enter

        1. 在文件资源管理器中右键单击要执行的Python文件并选择Run Current File in Interactive Window

        这将启动一个交互式会话,包括 linting、代码完成和语法高亮:

        输入您要评估的代码,然后点击键盘上的shift + enter 执行。

        享受 Python!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 2016-01-27
          • 2011-07-29
          • 1970-01-01
          • 1970-01-01
          • 2014-02-16
          相关资源
          最近更新 更多