#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)