You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Waf运行自定义Task类?执行代码遇命令未找到错误

如何让Waf运行自定义Task类

你遇到的错误是因为bld(rule="move_files")会让Waf把move_files当成shell命令去执行,而系统中并没有这个命令,所以报错。要运行自定义的Task类,不能用rule参数,需要通过Waf的任务创建API来实现。

正确实现方式

基础版(直接创建任务实例)

from waflib.Task import Task
import os

class move_files(Task):
    def run(self):
        # 这里可以替换成你需要执行的逻辑
        os.system("cp foo bar")

def build(bld):
    # 创建自定义Task类的实例并添加到构建流程
    bld.create_task('move_files')

优化版(添加输入输出依赖)

为了让Waf能正确跟踪文件变化(仅当输入文件更新时才执行任务),建议指定任务的输入和输出:

from waflib.Task import Task
from waflib import Utils

class move_files(Task):
    def run(self):
        # 使用Waf内置的跨平台文件复制工具,比os.system更可靠
        Utils.copy_file(self.inputs[0].abspath(), self.outputs[0].abspath())

def build(bld):
    tsk = bld.create_task('move_files')
    # 指定输入文件(必须存在)
    tsk.inputs = bld.path.find_resource('foo')
    # 指定输出文件(会自动创建父目录)
    tsk.outputs = bld.path.find_or_declare('bar')

关键说明

  • 自定义Task类继承自waflib.Task.Task后,Waf会自动将类名注册为任务类型,直接用create_task即可创建实例。
  • 不要用rule参数调用自定义Task类,rule仅适用于shell命令或简单Python函数。
  • 添加输入输出后,Waf会自动处理依赖关系,避免不必要的重复构建。

内容的提问来源于stack exchange,提问作者Thundercleez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:22:37