如何中断 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 项目的联合经理)
我正在使用 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 项目的联合经理)