2009-08-11 60 views
2

试图在Eclipse的Eclipse + Pydev的:当按下“停止”,“

class Try: 
    def __init__(self): 
     pass 
    def __del__(self): 
     print 1 
a=Try() 
raw_input('waiting to finish') 

运行此文件,并没有让程序完成按下停止按钮“清理”功能不叫不打印如果我尝试从shell运行脚本并且执行ctrl-c \ sys.exit“1”确实会被打印,即del被调用 同样的事情,如果我尝试使用等待():

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” 未被打印

这是为什么? 有没有办法解决它?

谢谢,诺姆

回答

2

按下停止公然杀害解释(虽然它实际上失败相当频繁)。像使用kill/taskkill一样,该过程不知道它会消亡。维基百科

Ctrl+C片断...

控制-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,很遗憾。

+0

谢谢,但我认为你没有回答我的问题 - 当从shell运行时,用ctrl-c停止* interpreter *仍然调用__del__,但是在eclipse中停止它时不会发生。 我不是在寻找一个解决方案,只是想知道是什么导致了差异 – olamundo 2009-08-11 19:01:17

+0

我有点偏离,或至少解释不好,所以我清理了一下,并添加了更多的信息。 – Zwergner 2009-08-12 01:32:31

+0

好的,谢谢 - 你的答案是现货。起初我不明白。抱歉 – olamundo 2009-08-13 09:14:41

4

Python文档:

__del__(self) 

当实例即将被破坏时调用。这也被称为析构函数。如果基类具有__del__()方法,则派生类的__del__()方法(如果有)必须显式调用它以确保正确删除实例的基类部分。请注意,__del__()方法有可能(尽管不推荐!)通过创建新的引用来推迟实例的销毁。然后可能会在稍后删除此新参考时调用它。 无法保证__del__()方法在解释器退出时仍然存在的对象被调用。

如果你想保证一个方法被称为使用在Eclipse中with-statement

+0

也许我我错过了一些东西,但我不确定这对我的情况是正确的: 我有A类,它拥有B类的实例,B拥有一些外部资源,它必须在退出时明确释放。 我该如何解决这个问题与使用?使显式方法称为close()同时用于A和B? – olamundo 2009-08-11 19:06:42

+0

此外,wait()在eclipse中不起作用比删除更好 - 尝试按停止,您会看到__exit__未被调用... – olamundo 2009-08-11 20:18:47