如何从中断处继续/重新加载Python(IDLE)[2.7] shell?

时间:2016-01-25 22:12:46

标签: python python-2.7 shell python-idle

在Python 2.7中,我正在使用IDLE shell中的广泛站立环境调试导入的模块。我希望自动重新创建该环境(相对于逐行手动输入),以便在每次Check Module时触发调试(触发shell中的自动重启并丢失当前状态)。有没有办法保存shell状态,或创建一个脚本来重新打开shell [实际上]已经运行了许多命令?

这与保存文件或脚本不同 - 我希望将shell恢复到之前的状态。例如,如果我已执行import os, numpy并分配了多个变量a = 'foo'bar = 229,我想将shell恢复到已导入os,numpy和已分配的相同状态abar

解决注释:打开文件会空闲打开文件;不是我想要的。保存脚本很好,但不会恢复shell窗口的状态。

2 个答案:

答案 0 :(得分:2)

创建一个脚本(例如test_this.py),并添加您键入的所有行

import os
import numpy
a = 'blah'
bar = 229

完成后,保存并按F5(运行),它将出现在IDLE解释器中。如果您有任何错误,它们也会出现,您可以学习调试。

(添加为回复而非评论,因为评论不允许多行编写脚本)

答案 1 :(得分:1)

之前提到的obvios和几乎唯一的解决方案是脚本,假设您正在调试mymod.py,那么您有以下选项

  1. mymod.py

    中重新创建状态
    #my stuff
    ...
    if __name__ == "__main__": 
        import os, numpy
        a = 'blah'
        bar = 229
        print "debugging environment ready"
    

    使用IDLE打开并运行它(F5)或使用python -i mymod.py

  2. 以交互模式打开它
  3. 制作一个新脚本来测试它,比如mytest.py

    import mymod
    import os, numpy
    a = 'blah'
    bar = 229
    print "debugging environment in outside script ready"
    

    然后在空闲或交互模式下运行它

  4. 在这两种情况下,您都会在会话中重新创建所需的状态,如果您想要一个不同的状态,请将其放入脚本中。

    例如在空闲时,你得到第一个

    ================= RESTART: C:\Users\David\Documents\Python Scripts\mymod.py =================
    debugging environment ready
    >>> a
    'blah'
    >>> bar
    229
    >>> os
    <module 'os' from 'C:\Python27\lib\os.pyc'>
    >>> 
    

    和第二个

    ================ RESTART: C:/Users/David/Documents/Python Scripts/mytest.py ================
    debugging environment in outside script ready
    >>> a
    'blah'
    >>> os
    <module 'os' from 'C:\Python27\lib\os.pyc'>
    >>> bar
    229
    >>> mymod
    <module 'mymod' from 'C:/Users/David/Documents/Python Scripts\mymod.pyc'>
    >>> 
    
    1. 一个更复杂的选项是在shell中执行此操作

      >>> import mymod
      >>> import os, numpy
      >>> a = "blah"
      >>> bar = 229
      

      我们可以说你在mymod.py中修改了一些内容,例如添加这一行new_stuff = 42

      >>> mymod.new_stuff
      
      Traceback (most recent call last):
        File "<pyshell#14>", line 1, in <module>
          mymod.new_stuff
      AttributeError: 'module' object has no attribute 'new_stuff'
      >>> import sys
      >>> del sys.modules["mymod"]
      >>> import mymod
      >>> mymod.new_stuff
      42
      >>> a
      'blah'
      

      如果你没有重新加载mymod,你看到尝试访问new_stuff会失败,解决方法是重新导入mymod,但这样做只是访问以前加载的版本,所以你需要通过从sys中删除它来删除它.modules首先。

      这样做可以保留您拥有的状态,每次要查看mymod中的更改时,都必须执行此过程。

      但请注意,您可能会发现此方法存在奇怪的行为,例如:假设您在mymod.py中有此类

      class A:
          def __init__(self):
              self.a = 42
      

      你得到的是这个类的先前实例不再被重新分配

      >>> b = mymod.A()
      >>> del sys.modules["mymod"]
      >>> import mymod
      >>> c = mymod.A()
      >>> b.a
      42
      >>> c.a
      42
      >>> isinstance(b,mymod.A)
      False
      >>> isinstance(c,mymod.A)
      True
      >>> b
      <mymod.A instance at 0x02CA62D8>
      >>> c
      <mymod.A instance at 0x02CE5378>  
      >>>