2

このファイルをEclipseで実行しようとしています

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

プログラムを終了させずに停止ボタンを押しても「1」は出力されません。つまり、delメソッドが呼び出されることはありません。シェルからスクリプトを実行して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+ZEOFの送信に使用できます。周りを見回しましたが、残念ながらEclipseでCtrl+C/を送信する方法がないようです。0x03

于 2009-08-11T17:42:22.503 に答える