Python. Popen. Процесс сам рестартует. Как отловить?

Тема в разделе "Perl, Python, Ruby", создана пользователем khokhlov.aser, 11 фев 2018.

  1. khokhlov.aser

    khokhlov.aser Создатель

    Регистр.:
    1 дек 2015
    Сообщения:
    48
    Симпатии:
    34
    Есть код:

    Код:
    #Функция для отдельного потока, которая запускает внешнюю команду и ждет события - завершить
    def run(command, event):
        global process
        process = Popen([command, ""])
        while (not event.is_set()):
            pass
        process.kill()
    
    # инициализация переменных
    start_path = "C:\start.bat"
    process = None
    MyThread = None
    
    while True: # бесконечный цикл
         # получаем флаг что поток работает
         is_run = MyThread is not None and process is not None and MyThread.isAlive() and process.poll() is None
         if is_run:
              # тут анализирую логи, по необходимости пускаю сигнал окончания выполнения методом
              # stop_event.set()
         else
             # если не запущено, то запускаем
             stop_event = Event()
             myThread = Thread(target=run, args=(start_path, stop_event))
             myThread.start()
    
    В start.bat определение нескольких переменных окружения и запуск выполняемой программы.
    Вроде ничего, но проблема возникает когда выполняемая программа пытается перезапустить себя. У нее это получается, но я теряю контроль над возможностью ее завершения и is_run принимает не верное значение. В следствии чего запускается новый поток.
    Как победить?
     
  2. amsirion

    amsirion Создатель

    Регистр.:
    4 янв 2014
    Сообщения:
    10
    Симпатии:
    1
    Советую пройти курс от Mail.ru на Coursera. Там довольно неплохо разобрана работа с потоками на 3 и 4 неделе. Этот момент как раз разбирается
     
  3. khokhlov.aser

    khokhlov.aser Создатель

    Регистр.:
    1 дек 2015
    Сообщения:
    48
    Симпатии:
    34
    если вы знаете ответ, то можно было бы его сказать или дать ссылку, а не посылать куда подальше. или это скрытая реклама? тогда где ценник? ))