WindowsのPythonでsubprocess.terminate()をフックしたい
Pythonバージョン: 3.5.2
以下のようにサブプロセスを呼び出し、terminate()でサブプロセスを終了させるとします。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
import shlex
import time
def main():
p = subprocess.Popen(shlex.split('python3 child.py'),
shell=False)
time.sleep(3)
p.terminate()
if __name__ == '__main__':
main()
サブプロセス側ではSIGTERMハンドラを登録しておくと、LinuxではSIGTERMハンドラが呼び出されますが、Windowsでは呼び出されません。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
import signal
import shlex
import time
def main():
def sigterm_handler(signum, frame):
print('Child Catch SIGTERM')
raise KeyboardInterrupt('SIGTERM!!')
signal.signal(signal.SIGTERM, sigterm_handler)
try:
while True:
print('Hello child')
time.sleep(1)
except KeyboardInterrupt:
print('KeyboardInterrupt!!')
if __name__ == '__main__':
main()
ようはterminate()で終了させる時に、サブプロセス側で終了処理を行いたいのですが、何か方法はないでしょうか?atexitも試してみましたが呼び出されませんでした。
公式のドキュメントを見ると、
https://docs.python.jp/3/library/subprocess.html
Windowsではシグナルではなく、TerminateProcess()で終了されるとのことなので、TerminateProcess()をフックする必要がありそうです。こちらで調べている限りでは、少なくとも正攻法ではフックすることができないように思えます。