Eclipse + Pydev:按“停止”时不调用“清理”功能?

时间:2009-08-11 16:48:41

标签: python eclipse pydev del

尝试在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

2 个答案:

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