Как мне прервать длинную задачу, управляемую SCons?

#python #scons

#python #scons

Вопрос:

Я использую SCons для управления функцией Python long_task(), которая выполняет длинные вычисления. Если я вызываю long_task() непосредственно из скрипта, я могу прервать его с помощью Ctrl-C. Однако, если SCons запускает long_task() и я нажимаю Ctrl-C, то long_task() продолжает выполняться до завершения, а затем SCons сообщает: «Сборка прервана. / сборка завершена из-за ошибок «. Есть ли способ заставить Ctrl-C немедленно остановить long_task() в этой ситуации?

Если я использую обработчик сигналов в long_task() для обработки SIGINT, то он ведет себя так, как я хочу, но я бы предпочел не делать этого в каждой из нескольких таких длинных задач. Если я нажму Ctrl- , то и longtask(), и SCons немедленно завершат работу, но это кажется довольно радикальным.

Я использую SCons 3.0.1 и Python 3.6.5 под Ubuntu 18.04.

Вот минимальный файл SConstruct:

 #!/usr/bin/env python3

import time

def long_task(target, source, env):
    print('Starting long task')
    # Mimic a complex calculation
    for i in range(100):
        time.sleep(0.1)
    print('Finishing long task')

TestBuilder = Builder(action = long_task)

env = Environment(BUILDERS = {'TestBuild': TestBuilder})

env.TestBuild('dummy', [])
 

Ответ №1:

Я настоятельно рекомендую вам не запускать длительную логику python в качестве действия в сборщике. Вместо этого запустите его через shell как отдельную программу на python. Это также упрощает создание ограничения по времени в такой программе, чтобы она не выполнялась вечно..

Запуск длительной логики python внутри SCons ограничит параллельные сборки.

В основном просто не делайте этого..

(КСТАТИ. Я соруководитель проекта SCons)