без него это убьет и родителя.

я есть сервер, который запускает подпроцесс, и я могу сделатьsend_signal(SIGTERM) который убьет процесс. Но не изящно. Если я вызываю свой подпроцесс из оболочки (т. Е. Как отдельный процесс), определенный обработчик сигнала включается и завершается корректно.

server.py: (так что .. из другого скрипта, который я сначала вызываюstart_app(), и позжеexit_app()

def start_app():
    app = subprocess.Popen("python app.py")

def exit_app():
    p = app.poll()
    if p==None:
        print("Subprocess is alive") # debug
    app.send_signal(signal.SIGTERM)

app.py

def exit_signal_handler(signal, frame):
    print("Terminate signal received")
    app.exit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    signal.signal(signal.SIGTERM, exit_signal_handler)
    signal.signal(signal.SIGINT, exit_signal_handler)
    sys.exit(app.exec())

Опять же, если я позвоню app.py из оболочки и отправлюSIGTERMсигнал я получаю следTerminate signal received и приложение закрывается. Но когда app.py запускается сервером, и я звонюexit_app на сервере я получаю следSubprocess is alive (из server.py) и приложение убито, но сигнал не перехватывается обработчиком сигнала приложенияexit_signal_handler

РЕДАКТИРОВАТЬ: Кажется,send_signal() не отправляет сигналв подпроцесс в том смысле, что подпроцесс ловит сигнал. Он посылает сигнал о действии в подпроцессе:

    def send_signal(self, sig):
        """Send a signal to the process
        """
        if sig == signal.SIGTERM:
            self.terminate()
        elif sig == signal.CTRL_C_EVENT:
            os.kill(self.pid, signal.CTRL_C_EVENT)
        elif sig == signal.CTRL_BREAK_EVENT:
            os.kill(self.pid, signal.CTRL_BREAK_EVENT)
        else:
            raise ValueError("Unsupported signal: {}".format(sig))

Это, вероятно, отвечает на мой вопрос, но я оставлю это открытым ...

Ответы на вопрос(1)

Ваш ответ на вопрос