Как отправить SIGINT на python в подпроцессе - PullRequest
0 голосов
/ 18 марта 2020

У меня есть программа python, которая выполняет другой сценарий python в подпроцессе (да, я знаю, что эта архитектура не идеальна, но природа проекта делает это необходимым). Я пытаюсь:

1. отправить сигнал в подпроцесс python (имитировать уничтожение клавиатуры)

2. перехватите sigint в подпроцессе и выполните некоторую очистку перед выходом 1016 * try: while True: # some application logic pass except: # some cleanup logic print('bye') Но когда я запускаю A.py, B.py никогда не получает сигнал или выполняет очистку логи c. Есть идеи, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Возможно, попробуйте:

#!/usr/local/cpython-3.8/bin/python3

import signal
import subprocess
import time

proc = subprocess.Popen(['python3', 'B.py'], shell=False)
time.sleep(1)
proc.send_signal(signal.SIGINT)
proc.wait()

... как ваш A.py?

Я подозреваю, что оболочка игнорирует SIGINT, а не передает ее B.py.

1 голос
/ 18 марта 2020

На основании приведенного ниже комментария я запустил виртуальную машину Kubuntu, и она работает, если указать bash для использования и shell=False. Причина указана в комментарии, но /bin/sh имеет псевдоним dash в Debain / Ubuntu (возможно, и в других дистрибутивах). Чтобы определить, что использует ваша система, откройте терминал и введите ls -l /bin/sh.

A.py

proc = subprocess.Popen(['/bin/bash', '-c', 'python3 B.py'], shell=False)

Я запустил файл с python3 A.py. Версия: Python 3.6.7.

Предыдущий ответ

У меня работает. Я думаю, возможно, вам нужно использовать python3 в вашей строке.

Я на Арке Linux и python на самом деле python3.

Вот что у меня есть.

A.py

proc = subprocess.Popen('python B.py', shell=True)
time.sleep(1)
proc.send_signal(signal.SIGINT)

B.py

import time

try:
    while True:
        time.sleep(0.25)
        print('running B')
except KeyboardInterrupt:
    print('bye')

Вывод:

running B
running B
running B
bye
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...