質問
私は、子プロセスを殺すために責任がある機能を持っているときに、プログラムが終了します:
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
が呼び出される前に、はsignal
とatexit
モジュールのように見えるがアンロードされます。再インポートする彼らは問題を解決するが、この動作は、私には奇妙なようだ - 私は私のハンドラを登録する前に、これらのモジュールがインポートされ、なぜ彼らは
解決
それは
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
として「システム提供の」モジュールの少ないものの、プログラムの終了とも終わりのないループの減速原因と考えられることができる)。
所属していません StackOverflow