Python: How to prevent subprocesses from receiving CTRL-C / Control-C / SIGINT

前端 未结 5 816
有刺的猬
有刺的猬 2020-12-13 00:26

I am currently working on a wrapper for a dedicated server running in the shell. The wrapper spawns the server process via subprocess and observes and reacts to its output.<

5条回答
  •  南笙
    南笙 (楼主)
    2020-12-13 00:51

    Somebody in the #python IRC-Channel (Freenode) helped me by pointing out the preexec_fn parameter of subprocess.Popen(...):

    If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. (Unix only)

    Thus, the following code solves the problem (UNIX only):

    import subprocess
    import signal
    
    def preexec_function():
        # Ignore the SIGINT signal by setting the handler to the standard
        # signal handler SIG_IGN.
        signal.signal(signal.SIGINT, signal.SIG_IGN)
    
    my_process = subprocess.Popen(
        ["my_executable"],
        preexec_fn = preexec_function
    )
    

    Note: The signal is actually not prevented from reaching the subprocess. Instead, the preexec_fn above overwrites the signal's default handler so that the signal is ignored. Thus, this solution may not work if the subprocess overwrites the SIGINT handler again.

    Another note: This solution works for all sorts of subprocesses, i.e. it is not restricted to subprocesses written in Python, too. For example the dedicated server I am writing my wrapper for is in fact written in Java.

提交回复
热议问题