36871


Pythonバージョン: 3.5.2

タイトルにある通り、下記のようなコードでCTRL_C_EVENTを送信すると、メインプロセス側でもKeyboardInterruptが発生してしまいます。

[code]

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import subprocess
    import shlex
    import time
    import signal
    
    
    def main():
        p = subprocess.Popen(shlex.split('python3 child.py'),
                             shell=False,
                             )
        time.sleep(2)
        print('Send signal')
        p.send_signal(signal.CTRL_C_EVENT)
        p.wait() # <= ここでKeyboardInterruptが発生する
    
    
    if __name__ == '__main__':
        main()
    
    << Traceback (most recent call last):
    <<   File "test.py", line 48, in <module>
    <<     main()
    <<     └ <function main at 0x02805810>
    <<   File "test.py", line 26, in main
    <<     p.wait()
    <<     └ <subprocess.Popen object at 0x02F25CD0>
    <<   File "C:\Python35-32\lib\subprocess.py", line 1275, in wait
    <<     timeout_millis)
    
[/code]

wait()だけでなく、print()等の、ブロックが発生する関数を呼び出して時点でKeyboardInterrputが呼び出されているように思います。  
これはこういった仕様なのでしょうか？Windowsでsubprocessを安全に終了させる方法が中々見つけることができず、苦戦しています。


CC BY-SA 3.0
2017-07-23T07:42:58.603
36609
2017-08-02T05:28:15.750
17238
question
python windows
WindowsのPythonでsubprocessにsignal.CTRL_C_EVENTを送るとメインプロセスにもKeyboardInterrputが発生する


質問に対する直接的な回答ではありませんが、[`CTRL_C_EVENT`は`os.kill()`メソッド専用](https://docs.python.org/3/library/signal.html#signal.CTRL_C_EVENT)です。

> `signal.CTRL_C_EVENT`  
>  The signal corresponding to the `Ctrl+C` keystroke event. This signal can
> only be used with `os.kill()`.

そもそもライブラリ仕様の範囲外となるため、事象の理由について説明するのは難しいでしょう。（そのPython処理系の該当バージョンではたまたまそうなったというだけ）


CC BY-SA 3.0
2017-08-02T05:28:15.750
36871
2017-08-02T05:28:15.750
49
36609
answer