Сценарий Python останавливается после завершения подпроцесса - PullRequest
0 голосов
/ 18 февраля 2019

При запуске моего сценария я динамически запускаю набор циклов for.По сути, вызывая список элементов, проверяя, на какой «стадии» нужно выполнить этот элемент, а затем запуская их все в указанном порядке.Когда я пытаюсь запустить эти циклы, он проходит через первый объект, а затем выдает «[1] + Stopped Script.py» в терминале.Я нашел способы запустить резервное копирование своего сценария, но нет поста о том, как этого избежать полностью.

Я пытался использовать Popen, call, check_output и т. Д. Они все получаюттот же результат.Я уверен, что это другой пункт, который я вызываю, который делает это в конце этого, но я не думаю, что закрытие другой программы должно убить мой скрипт, особенно не в подпроцессе.

У меня естьтакже пробовал использовать многопоточность и многопоточность.И то, и другое безрезультатно.

def foo(list):
    stages = 0
    for c in things:
        info = load_json_info(c)
        if info["stage"] >= stages:
            stages = info["stage"]
    for p in list:
        use_list(p)
    stages = stages + 1
    for i in range(stages):
        for b in list:
            info = load_json_info(b)
            if info["stage"] == i:
                if info["check"] != "NO":
                    output = call("command", shell=True)
                    if output == 0:
                        DO_THING()
                    else:
                        DONT_DO_THING()
                else:
                    DONT_DO_THING()

Достигает DO_THING() и проходит через все это, затем, когда приходит время вызывать другой подпроцесс, оно снова умирает.Живет ли этот подпроцесс в DO_THING() или я закомментирую все и просто заставлю его снова попасть в строку output = call("command", shell=True).Как только он снова начинает использовать подпроцесс, он останавливается.

Есть ли какие-либо предложения или способы, которые люди нашли, чтобы заблокировать то, что передается, чтобы остановить мой сценарий?

(Как раз в голову, у меня нет доступа к источнику "command"это приводит к остановке моего сценария, и "command", который я использую, не важен, так как я ничего не могу сделать с этой целью. Я должен также использовать этот "command".)

1 Ответ

0 голосов
/ 18 февраля 2019

Сообщение, которое вы видите, указывает на то, что ваш подпроцесс остановлен , а не на том, что произошла ошибка.Это происходит, например, при вводе Ctrl-Z после запуска процесса в оболочке или, что эквивалентно, при отправке целевому процессу сигнала SIGTSTP с помощью команды kill.Предположительно, command, к которому у вас нет доступа, получает этот сигнал.Он может даже отправлять его самому себе, хотя, не зная больше о команде, он просто размышляет о том, как или почему это происходит.

Вы можете игнорировать этот сигнал в Python, используямодуль signal, в частности, функция pthread_sigmask().Один указывает маску сигналов и что с ними делать.В этом случае вы хотите игнорировать сигнал SIGTSTP, что можно сделать с помощью: signal.pthread_sigmask(signal.SIG_BLOCK, (signal.SIGTSTP,)).(Последний аргумент на самом деле представляет собой последовательность сигналов, которые нужно игнорировать.)

Запустив этот фрагмент кода, вы должны увидеть, что вы можете набрать Ctrl-Z в терминале, а оболочка должна показать [1]+ Stopped ...:

import time
duration = 5.0
print('Sleeping for {:0.2f} seconds'.format(duration))
time.sleep(duration)

Однако, используя следующий код, вы увидите, что сигнал игнорируется, и процесс продолжит "работать" (в данном случае в спящем режиме) независимо от сигнала.Вы должны просто видеть ^Z в оболочке всякий раз, когда вы нажимаете Ctrl-Z.

import time
import signal
duration = 5.0
print('Sleeping for {:0.2f} seconds, ignoring SIGTSTP'.format(duration))
signal.pthread_sigmask(signal.SIG_BLOCK, (signal.SIGTSTP,))
time.sleep(duration)

Чтобы фактически использовать это в вашем скрипте, игнорируйте сигнал, прежде чем вызывать соответствующий command.Рекомендуется предварительно запросить маску сигналов процесса и сбросить ее до этого значения после того, как вы закончите с command.Для получения дополнительной информации о сигналах и процессах вам следует просмотреть справочные страницы для signal(3), sigprocmask(2) и kill(2).

Редактировать для Python <= 2.7 </strong>

signal.pthread_sigmask был добавлен в Python 3.3.Решение, которое должно работать для более ранних версий, состоит в том, чтобы напрямую игнорировать сигнал, устанавливая обработчик, который делает именно это.Например:

import signal
import time

duration = 5.0
signal.signal(signal.SIGTSTP, signal.SIG_IGN)
print 'Sleeping for %f seconds, ignoring SIGTSTP' % duration
time.sleep(duration)

Как и в примере 3.3 выше, вы должны просто увидеть ^Z, если вы нажмете Ctrl-Z, указывая, что сигнал был проигнорирован.

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