我怎样才能 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,并分配了 a
和 bar
.
解决评论:打开文件会打开处于空闲状态的文件;不是我想要的。保存脚本没问题,但不会恢复 shell window.
的状态
创建一个脚本(例如 test_this.py),并添加您输入的所有行
import os
import numpy
a = 'blah'
bar = 229
完成后,保存并按 F5 (运行),它将出现在 IDLE 解释器中。如果你有任何错误,它们也会出现,你可以学习调试。
(添加为回复而非评论,因为评论不允许 multi-line 编写脚本)
obvios 和之前提到的几乎唯一的解决方案是一个脚本,假设您正在调试 mymod.py
那么您有以下选项
重新创建 mymod.py
中的状态
#my stuff
...
if __name__ == "__main__":
import os, numpy
a = 'blah'
bar = 229
print "debugging environment ready"
使用 IDLE 和 运行 (F5) 打开它,或者使用 python -i mymod.py
在交互模式下打开它
制作一个新的脚本来测试它,比如说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'>
>>>
在 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>
>>>
在 Python 2.7 中,我正在调试导入的模块,在 IDLE shell 中使用广泛的站立环境。我希望在每次 Check Module
时自动重新创建该环境(与手动逐行输入相比)以简化调试(在 shell 和 los 中触发自动重启状态)。有没有一种方法可以保存 shell 状态,或者创建一个脚本来重新打开 shell [原样] 已经有一些命令 运行?
这不同于保存文件或脚本 - 我希望将 shell 恢复到之前的状态。例如,如果我执行了 import os, numpy
,并分配了几个变量 a = 'foo'
、bar = 229
,我想将 shell 恢复到已经导入 [=] 的相同状态26=]、numpy,并分配了 a
和 bar
.
解决评论:打开文件会打开处于空闲状态的文件;不是我想要的。保存脚本没问题,但不会恢复 shell window.
的状态创建一个脚本(例如 test_this.py),并添加您输入的所有行
import os
import numpy
a = 'blah'
bar = 229
完成后,保存并按 F5 (运行),它将出现在 IDLE 解释器中。如果你有任何错误,它们也会出现,你可以学习调试。
(添加为回复而非评论,因为评论不允许 multi-line 编写脚本)
obvios 和之前提到的几乎唯一的解决方案是一个脚本,假设您正在调试 mymod.py
那么您有以下选项
重新创建
中的状态mymod.py
#my stuff ... if __name__ == "__main__": import os, numpy a = 'blah' bar = 229 print "debugging environment ready"
使用 IDLE 和 运行 (F5) 打开它,或者使用
python -i mymod.py
在交互模式下打开它
制作一个新的脚本来测试它,比如说
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'>
>>>
在 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
中有此 classclass 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> >>>