【问题标题】:Is it possible to go into ipython from code?是否可以从代码进入 ipython?
【发布时间】:2010-11-10 17:55:51
【问题描述】:

对于我的调试需求,pdb 很不错。但是,如果我可以进入ipython,那将会更加更酷(并且很有帮助)。这可能吗?

【问题讨论】:

    标签: python shell debugging ipython pdb


    【解决方案1】:

    通常,当我使用 ipython 时,我会使用其中的“pdb”命令打开自动调试。

    然后我在我的脚本所在的目录中使用“run myscript.py”命令运行我的脚本。

    如果我遇到异常,ipython 会在调试器中停止程序。查看魔术 ipython 命令的帮助命令 (%magic)

    【讨论】:

    • 所以没有办法写像 ipython.set_trace() 这样的东西? :)
    【解决方案2】:

    来自IPython docs

    import IPython.ipapi
    namespace = dict(
        kissa = 15,
        koira = 16)
    IPython.ipapi.launch_new_instance(namespace)
    

    将以编程方式启动 IPython shell。显然,namespace dict 中的值只是虚拟值——在实践中使用locals() 可能更有意义。

    请注意,您必须将其硬编码;它不会像pdb 那样工作。如果这就是您想要的,DoxaLogos 的答案可能更像您正在寻找的。​​p>

    【讨论】:

      【解决方案3】:

      有一个ipdb 项目将 iPython 嵌入到标准 pdb 中,所以你可以这样做:

      import ipdb; ipdb.set_trace()
      

      它可以通过通常的pip install ipdb 安装。

      ipdb 非常短,因此您也可以在 Python 路径的某处创建一个文件 ipdb.py,而不是 easy_installing,然后将以下内容粘贴到文件中:

      import sys
      from IPython.Debugger import Pdb
      from IPython.Shell import IPShell
      from IPython import ipapi
      
      shell = IPShell(argv=[''])
      
      def set_trace():
          ip = ipapi.get()
          def_colors = ip.options.colors
          Pdb(def_colors).set_trace(sys._getframe().f_back)
      

      【讨论】:

      • 与 Django 配合得非常好。好吧,除了我看不到我正在输入的文本这一事实,但这可能很容易修复(因为 ipdb 只有六行)。
      • 实际上,存在的问题是 Django 为 runserver 分叉了一个单独的线程,并且每当您进行代码编辑时,它都会重新生成线程。这通常工作正常,但如果你在线程被杀死时坐在 pdb 中,终端就会发疯。您可以通过中断 runserver、runniny 'stty sane',然后再次启动 runserver 来解决此问题。
      • @daniel-roseman 嗨,我收到了 ModuleNotFoundError: No module named 'IPython.Debugger'ModuleNotFoundError: No module named 'IPython.Shell'ImportError: cannot import name 'ipapi'
      • @memoselyk 嗨,我收到了 ModuleNotFoundError: No module named 'IPython.Debugger'ModuleNotFoundError: No module named 'IPython.Shell'ImportError: cannot import name 'ipapi'
      • 有一种方法可以让breakpoint()函数进入ipdb。
      【解决方案4】:

      相当于

      import pdb; pdb.set_trace()
      

      IPython 是这样的:

      from IPython.ipapi import make_session; make_session()
      from IPython.Debugger import Pdb; Pdb().set_trace()
      

      这有点冗长,但很高兴知道您是否没有安装 ipdb。 make_session 调用需要一次来设置配色方案等,set_trace 调用可以放在任何你需要中断的地方。

      【讨论】:

        【解决方案5】:

        快速简便的方法:

        from IPython.Debugger import Tracer
        debug = Tracer()
        

        那就写吧

        debug()
        

        无论您想从哪里开始调试程序。

        【讨论】:

        • ImportError: No module named 'IPython.Debugger' on python 3.4 / IPython 3
        【解决方案6】:

        在 IPython 0.11 中,您可以像这样将 IPython 直接嵌入到您的代码中

        您的程序可能如下所示

        In [5]: cat > tmpf.py
        a = 1
        
        from IPython import embed
        embed() # drop into an IPython session.
                # Any variables you define or modify here
                # will not affect program execution
        
        c = 2
        
        ^D
        

        当你运行它时会发生这种情况(我随意选择在现有的 ipython 会话中运行它。根据我的经验,像这样嵌套 ipython 会话可能会导致它崩溃)。

        In [6]:
        
        In [6]: run tmpf.py
        Python 2.7.2 (default, Aug 25 2011, 00:06:33)
        Type "copyright", "credits" or "license" for more information.
        
        IPython 0.11 -- An enhanced Interactive Python.
        ?         -> Introduction and overview of IPython's features.
        %quickref -> Quick reference.
        help      -> Python's own help system.
        object?   -> Details about 'object', use 'object??' for extra details.
        
        In [1]: who
        a       embed
        
        In [2]: a
        Out[2]: 1
        
        In [3]:
        Do you really want to exit ([y]/n)? y
        
        
        In [7]: who
        a       c       embed
        

        【讨论】:

        • 进入 IPython 会话非常酷。非常感谢!
        • 我愚蠢地将它放在一个(几乎无限的)循环中。我怎么能出去?
        • @gerrit,如果你还在里面,请按 Ctrl + d。
        • @confused00 那将是无限的,6 个月后 ;-)
        • @gerrit,如果你卡在嵌入循环中:def f() : pass ; IPython.embed = f 这样embed() 调用是一个 noop,然后 Ctrl + D
        【解决方案7】:

        我喜欢简单地将这一行粘贴到我想要设置断点的脚本中:

        __import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
        

        较新的版本可能会使用:

        __import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
        

        【讨论】:

          【解决方案8】:

          如果您使用的是更现代的 IPython (> 0.10.2) 版本,则可以使用类似

          from IPython.core.debugger import Pdb
          Pdb().set_trace()
          

          但最好只使用 ipdb

          【讨论】:

            【解决方案9】:

            看起来模块最近被改组了。在 IPython 0.13.1 上,以下对我有用

            from IPython.core.debugger import Tracer; breakpoint = Tracer()
            
            breakpoint() # <= wherever you want to set the breakpoint
            

            虽然唉,这一切都很漂亮worthless in qtconsole

            【讨论】:

              【解决方案10】:

              较新版本的 IPython 提供了一种简单的机制,可以将 IPython 会话嵌入和嵌套到任何 Python 程序中。您可以关注the following recipe 来嵌入 IPython 会话:

              try:
                  get_ipython
              except NameError:
                  banner=exit_msg=''
              else:
                  banner = '*** Nested interpreter ***'
                  exit_msg = '*** Back in main IPython ***'
              
              # First import the embed function
              from IPython.frontend.terminal.embed import InteractiveShellEmbed
              # Now create the IPython shell instance. Put ipshell() anywhere in your code
              # where you want it to open.
              ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)
              

              然后,当您想进入 IPython shell 时,请使用 ipshell()。这将允许您在代码中嵌入(甚至嵌套)IPython 解释器。

              【讨论】:

                【解决方案11】:

                如果最近几天我不得不在谷歌上搜索几次,所以添加一个答案......有时能够正常运行脚本并且只在出现错误时才进入 ipython/ipdb 是很好的,而不必输入 ipdb.set_trace()代码中的断点

                ipython --pdb -c "%run path/to/my/script.py --with-args here"
                

                (当然是pip install ipythonpip install ipdb

                【讨论】:

                • 谢谢!简单一点:ipython --pdb -- ./path/to/my/script --with-args here
                【解决方案12】:

                这很简单:

                ipython some_script.py --pdb

                它需要安装 iPython,通常这样可以: pip install ipython

                我使用 ipython3 而不是 ipython,所以我知道它是 Python 的最新版本。

                这很容易记住,因为您只需使用 iPython 而不是 python,并在末尾添加 --pdb。

                【讨论】:

                  【解决方案13】:

                  要使用终端颜色获得 IPython 的 REPL,我必须这样做:

                  from IPython import start_ipython
                  
                  start_ipython()
                  

                  https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-03-29
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-12-01
                    • 2017-05-31
                    • 2015-07-25
                    • 1970-01-01
                    • 2020-12-10
                    相关资源
                    最近更新 更多