如何中断 SCons 管理的长任务?

How do I interrupt a long task managed by SCons?

我正在使用 SCons 来管理执行长时间计算的 Python 函数 long_task()。如果我直接从脚本调用 long_task() ,那么我可以使用 Ctrl-C 中断它。但是,如果 SCons 是 运行ning long_task() 并且我按 Ctrl-C,那么 long_task() 会继续 运行 直到完成,并且 然后 SCons 说 "Build interrupted. / building terminated because of errors"。在这种情况下,有没有办法让 Ctrl-C 立即停止 long_task()?

如果我在 long_task() 中使用信号处理程序来处理 SIGINT,那么它会按照我的意愿运行,但我宁愿不必在几个如此长的任务中的每一个中都这样做。 如果我按 Ctrl-\ 然后 longtask() 和 SCons 都会立即退出,但这看起来相当激烈。

我在 Ubuntu 18.04 下使用 SCons 3.0.1 和 Python 3.6.5。

这是一个最小的 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', [])

我强烈建议您不要 运行 将 运行 宁 python 逻辑作为构建器中的一个动作。 相反 运行 它通过 shell 作为一个独立的 python 程序。 这也简化了在此类程序中建立时间限制,因此它不会 运行 永远..

运行 long 运行ning python SCons 中的逻辑将限制并行构建。

基本上就是不做..

(顺便说一句。我是 SCons 项目的联合经理)