我怎样才能 resume/reload a Python (IDLE) [2.7] shell 它停止的地方?

How can I resume/reload a Python (IDLE) [2.7] shell where it left off?

在 Python 2.7 中,我正在调试导入的模块,在 IDLE shell 中使用广泛的站立环境。我希望在每次 Check Module 时自动重新创建该环境(与手动逐行输入相比)以简化调试(在 shell 和 los 中触发自动重启状态)。有没有一种方法可以保存 shell 状态,或者创建一个脚本来重新打开 shell [原样] 已经有一些命令 运行?

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

解决评论:打开文件会打开处于空闲状态的文件;不是我想要的。保存脚本没问题,但不会恢复 shell window.

的状态

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

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

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

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

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"
    

    和运行这个代替,在空闲或交互模式下

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

比如在空闲的时候,用第一个就可以了

================= 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 会失败,解决方案是 re-import mymod,但这样做只会访问之前加载的版本,因此您需要删除首先将其从 sys.modules 中删除。

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

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

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

    你知道这个 class 的先前实例不再被重新处理

    >>> 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>  
    >>>