2

试图在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”

这是为什么?有办法解决吗?

谢谢,诺姆

4

2 回答 2

4

Python 文档:

__del__(self)

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

如果要保证调用方法,请使用with 语句

于 2009-08-11T16:59:28.813 回答
2

在 Eclipse 中按下 stop 会直接杀死解释器(尽管它实际上经常失败)。就像使用kill/一样taskkill,该过程不知道它的消亡。

来自维基百科的Ctrl+C片段...

Control-C 作为中止命令被 UNIX 推广并在其他系统中采用。在 POSIX 系统中,该序列导致活动程序接收 SIGINT 信号。如果程序没有指定如何处理这种情况,它就会被终止。通常,处理 SIGINT 的程序仍会自行终止,或至少终止在其中运行的任务。

Ctrl+C是中断程序的控制信号,但正如您可能在该段中间注意到的那样,程序可以指定如何处理信号。在 Python 中,Ctrl+C会抛出一个 KeyboardInterrupt 异常,该异常通常会被捕获,然后 Python 会干净地退出。即使你用它杀死解释器Ctrl+C也可以处理它,以便它在退出之前清理环境。

我包括以下内容是因为您问“有没有办法解决它?”

如果您想停止raw_input(...)通话,可以使用Ctrl+Z发送 EOF。我环顾四周,不幸的是,似乎没有办法在 Eclipse中发送Ctrl+C/ 。0x03

于 2009-08-11T17:42:22.503 回答