Уведомления

Группа в Telegram: присоединиться

#1 Май 15, 2018 19:59:27

alex.black
Зарегистрирован: 2018-05-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

CTRL+C не доходит до подпроцесса

Приветствую, прошу помочь с проблемой: имею необходимость завершить подпроцесс popen, делать это пытаюсь в два этапа: prc.send_signal(signal.CTRL_C_EVENT) + prc.stdin.write(….), но проблема какраз в том, первое отрабатывает 1/10 раз, что никак не устраивает - прошу подсказать что неверно делаю

Офлайн

#2 Май 16, 2018 00:10:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 3186
Репутация: +  175  -
Профиль   Отправить e-mail  

CTRL+C не доходит до подпроцесса

1 Приведите код как вы это делаете.
2. можно попробовать жестче поступить. У результата popen есть метод kill()



Офлайн

#3 Май 17, 2018 15:19:12

alex.black
Зарегистрирован: 2018-05-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

CTRL+C не доходит до подпроцесса

doza_and
1 Приведите код как вы это делаете.2. можно попробовать жестче поступить. У результата popen есть метод kill()

 prc = subprocess.Popen(prog, stdin=subprocess.PIPE, stdout=stream)
pid = prc.pid
while psutil.pid_exists(pid):
    if  time> time_allowed and signaled == False:
        prc.send_signal(signal.CTRL_C_EVENT)
        prc.stdin.write('Y\n'.encode())
        signaled = True
    time.sleep(1)
    time= time+ 1

жестче увы нельзя, нужно сохраниться, а не просто убить процесс

Отредактировано alex.black (Май 17, 2018 15:20:15)

Офлайн

#4 Май 28, 2018 12:49:46

alex.black
Зарегистрирован: 2018-05-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

CTRL+C не доходит до подпроцесса

Подскажите как исправить код, пожалуйста

Офлайн

#5 Май 28, 2018 15:24:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 2967
Репутация: +  210  -
Профиль   Отправить e-mail  

CTRL+C не доходит до подпроцесса

Винды у меня нет под рукой, вот вам быстрый рабочий пример под никсами. Для винды возможно надо поменять сигнал на тот который в Вашем примере.
py_main.py:

 import time
def main():
    counter = 0
    while True:
        try:
            print(counter)
            counter += 1
            time.sleep(1)
        except KeyboardInterrupt:
            s = input('Are you sure? Y/N')
            if s == 'Y':
                print('Good Bye')
                break
if __name__ == '__main__':
    main()

py_sec.py:
 import subprocess
import time
import signal
sp = subprocess.Popen(['python3', 'py_main.py'], stdin=subprocess.PIPE)
time.sleep(3)
sp.send_signal(signal.SIGINT)
time.sleep(0.25)
sp.stdin.write('Y\n'.encode())



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version