

Pythonバージョン: 3.5.2

以下のようにサブプロセスを呼び出し、terminate()でサブプロセスを終了させるとします。

[code]

    #!/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()
    
[/code]

サブプロセス側ではSIGTERMハンドラを登録しておくと、LinuxではSIGTERMハンドラが呼び出されますが、Windowsでは呼び出されません。

[code]

    #!/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()
    
[/code]

ようはterminate()で終了させる時に、サブプロセス側で終了処理を行いたいのですが、何か方法はないでしょうか？atexitも試してみましたが呼び出されませんでした。

公式のドキュメントを見ると、  
<https://docs.python.jp/3/library/subprocess.html>  
Windowsではシグナルではなく、TerminateProcess()で終了されるとのことなので、TerminateProcess()をフックする必要がありそうです。こちらで調べている限りでは、少なくとも正攻法ではフックすることができないように思えます。


CC BY-SA 3.0
2017-07-23T05:53:38.003
36607
2017-07-24T01:27:44.157
2017-07-24T01:27:44.157
17238
17238
question
python windows winapi
WindowsのPythonでsubprocess.terminate()をフックしたい