質問

私は、子プロセスを殺すために責任がある機能を持っているときに、プログラムが終了します:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)

    def stop(self):
        os.kill(self.sel_server_pid, signal.SIGTERM)

私は、この関数が呼び出され、エラーメッセージが表示されますしかします:

Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
   func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
   os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'
osが呼び出される前に、

signalatexitモジュールのように見えるがアンロードされます。再インポートする彼らは問題を解決するが、この動作は、私には奇妙なようだ - 私は私のハンドラを登録する前に、これらのモジュールがインポートされ、なぜ彼らは

自分の終了ハンドラを実行する前にアンロードされています?
役に立ちましたか?

解決

それはatexit-登録されている機能は、自己完結していることを確認するのがベストですので、

物事はプログラム終了時に破壊される順番については何の強力な保証は、ありません。例えば、あなたのケースでます:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)
        self._dokill = os.kill
        self._thesig = signal.SIGTERM

    def stop(self):
        self._dokill(self.sel_server_pid, self._thesig)

これは再インポートモジュール(そのリスクは、osとして「システム提供の」モジュールの少ないものの、プログラムの終了とも終わりのないループの減速原因と考えられることができる)。

に好ましいです
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top