尝试在eclipse中运行此文件
class Try:
def __init__(self):
pass
def __del__(self):
print 1
a=Try()
raw_input('waiting to finish')
并按下停止按钮而不让程序完成不打印“1”,即从不调用del方法。如果我尝试从shell运行脚本并执行ctrl-c \ sys.exit“1”确实打印,即del被调用。 如果我尝试使用wait():
,同样的事情class A:
def __enter__(self):
return None
def __exit__(self, type, value, traceback):
print 3
with A():
print 1
raw_input('Waiting')
print 2
如果我在提示时按“停止”,则不打印“3”
为什么? 有办法吗?
谢谢,Noam
答案 0 :(得分:4)
Python文档:
__del__(self)
当实例即将被销毁时调用。这也称为析构函数。如果基类具有
__del__()
方法,则派生类的__del__()
方法(如果有)必须显式调用它以确保正确删除实例的基类部分。请注意,__del__()
方法可以(虽然不推荐!)通过创建对它的新引用来推迟实例的销毁。然后可以在稍后删除该新引用时调用它。 无法保证为解释器退出时仍然存在的对象调用__del__()
方法。
如果您想保证调用方法,请使用with-statement
答案 1 :(得分:2)
在Eclipse中按下stop会彻底杀死解释器(虽然它实际上经常失败)。就像使用kill
/ taskkill
一样,这个过程并不知道它会消亡。
Ctrl+C片段......
Control-C作为中止命令 由UNIX推广并被采用 其他系统。在POSIX系统中, 序列导致活动程序 收到SIGINT信号。如果 程序没有指定如何处理 这个条件终止了。 通常是一个处理的程序 一个SIGINT仍将自行终止, 或者至少终止正在运行的任务 在里面。
Ctrl+C
是用于中断程序的控制信号,但正如您在该段中间注意到的那样,程序可以指定如何处理信号。在Python中,Ctrl + C throws a KeyboardInterrupt exception通常被捕获,然后Python干净地退出。即使您使用Ctrl+C
杀死解释器,它也可以处理它,以便在退出之前清除环境。
我包含以下内容,因为您问“它有办法解决吗?”
如果您想停止raw_input(...)
来电,可以使用Ctrl+Z
发送EOF。我环顾四周,遗憾的是,似乎无法在Eclipse中发送Ctrl+C
/ 0x03
。