在Python 2.7中,我正在使用IDLE shell中的广泛站立环境调试导入的模块。我希望自动重新创建该环境(相对于逐行手动输入),以便在每次Check Module
时触发调试(触发shell中的自动重启并丢失当前状态)。有没有办法保存shell状态,或创建一个脚本来重新打开shell [实际上]已经运行了许多命令?
这与保存文件或脚本不同 - 我希望将shell恢复到之前的状态。例如,如果我已执行import os, numpy
并分配了多个变量a = 'foo'
,bar = 229
,我想将shell恢复到已导入os,numpy和已分配的相同状态a
和bar
。
解决注释:打开文件会空闲打开文件;不是我想要的。保存脚本很好,但不会恢复shell窗口的状态。
答案 0 :(得分:2)
创建一个脚本(例如test_this.py),并添加您键入的所有行
import os
import numpy
a = 'blah'
bar = 229
完成后,保存并按F5(运行),它将出现在IDLE解释器中。如果您有任何错误,它们也会出现,您可以学习调试。
(添加为回复而非评论,因为评论不允许多行编写脚本)
答案 1 :(得分:1)
之前提到的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会失败,解决方法是重新导入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>
>>>