Python 告诉waf等待任务完成后再开始下一个任务

Python 告诉waf等待任务完成后再开始下一个任务,python,waf,Python,Waf,我在waf中有两个任务,它们需要以正确的顺序执行,第二个任务必须等到第一个任务完成 为了证明它的行为符合我的预期,我在任务内部等待,第一个任务(t_1)4秒,第二个任务(t_2)1秒。第二项任务首先完成。这可以看出,因为我在等待后创建的文件夹具有时间戳t\u 2

我在waf中有两个任务,它们需要以正确的顺序执行,第二个任务必须等到第一个任务完成

为了证明它的行为符合我的预期,我在任务内部等待,第一个任务(
t_1
4秒,第二个任务(
t_2
1秒。第二项任务首先完成。这可以看出,因为我在等待后创建的文件夹具有时间戳
t\u 2

在一个问题中: 我如何告诉waf,在
t\u 1
成功完成后执行
t\u 2


  • MWE:wscript

    from waflib import Context, Options
    from waflib import Task, TaskGen
    from waflib.Tools.compiler_c import c_compiler
    
    def options(opt):
        opt.load('compiler_c')
    
    def configure(cnf):
        cnf.load('compiler_c')
    
    def build(bld):
        bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
    
    class t_1(Task.Task):
        always_run = True
        run_str = 'echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1'
        color = 'RED'
    
    
    @TaskGen.feature('t_1')
    @TaskGen.after('apply_link')
    @TaskGen.before('t_2')
    def add_t_1_task(self):
        self.create_task('t_1')
    
    
    class t_2(Task.Task):
        always_run = True
        run_str = 'echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2'
        color = 'RED'
    
    
    @TaskGen.feature('t_2')
    @TaskGen.after('apply_link', 't_1')
    def add_t_2_task(self):
        self.create_task('t_2')
    

  • 您必须在任务的
    属性中指定必须在之前运行的任务(在该示例中为
    t_1
    ),该属性应“等待另一个任务完成”(在该示例中为
    t_2
    )。 它是这样指定的:
    after=['t_1']

    这方面的文档可在中的部分中找到

    当前waf手册(waf 2.0)中解释的文件,特别是§9.3.4,解释了任务生成器的执行顺序


    完整的MWE示例如下所示:

    from waflib import Context, Options
    from waflib import Task, TaskGen
    from waflib.Tools.compiler_c import c_compiler
    
    def options(opt):
        opt.load('compiler_c')
    
    def configure(cnf):
        cnf.load('compiler_c')
    
    def build(bld):
        bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
    
    class t_1(Task.Task):
        always_run = True
        run_str = 'date && echo 1 && echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1 && date && echo 1'
        color = 'RED'
    
    
    @TaskGen.feature('t_1')
    @TaskGen.after('apply_link')
    @TaskGen.before('t_2')
    def add_t_1_task(self):
        self.create_task('t_1')
    
    
    class t_2(Task.Task):
        always_run = True
        after = ['t_1'] # <---------------------------- **The problems solution**
        run_str = 'date && echo 1 && echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2 && date && echo 2'
        color = 'RED'
    
    
    @TaskGen.feature('t_2')
    @TaskGen.after('apply_link', 't_1')
    def add_t_2_task(self):
        self.create_task('t_2')
    
    来自waflib导入上下文,选项
    从waflib导入任务,TaskGen
    从waflib.Tools.compiler\u c导入c\u编译器
    def选项(opt):
    opt.load('compiler_c')
    def配置(cnf):
    加载('compiler_c')
    def生成(bld):
    bld.program(features=['t_1','t_2',source='main.c',target='abc')
    t_1类(任务.任务):
    始终运行=真
    run_str='date&&echo 1&&echo start t_1&&python-c“import time;time.sleep(4)”&&echo end t_1&&mkdir t_1&&date&&echo 1'
    颜色=‘红色’
    @任务生成功能(“t_1”)
    @TaskGen.after('apply_link')
    @“t_2”之前的任务生成
    def添加任务(自我):
    self.create_任务('t_1'))
    t_2类(任务.任务):
    始终运行=真
    
    after=['t_1'].
    @TaskGen.before('t_2')
    是错误的。它应该是
    @TaskGen.before('add__2_任务'))
    。此外,这是不必要的。在您的示例中,任务
    t_1
    t_2
    可以以任何顺序创建。重要的是执行顺序。感谢您的评论。我在哪里可以找到文档,我需要将任务生成器方法而不是任务作为约束?但我的解决方案是使用
    after=['t_1']
    类t_2中(Task.Task):
    是否正确?@neuro很抱歉再次询问,但您似乎对waf很有经验,如果您能告诉我,在文档中哪里可以找到此信息,我将非常感激。我在当前waf手册中添加了任务方法执行顺序的参考,即§9.3.4。§9.3.6可能也很有趣,它解释了如何设置抽象依赖项感谢您更新您已经完美的答案-我已经阅读了这些部分,但似乎我遗漏了一些需要完全理解的内容,因此我将再次阅读!