如何将Fabric任务名称作为变量传递给execute()

0 投票
1 回答
644 浏览
提问于 2025-04-18 15:00

我遇到一个情况,任务的名字是从一个json文件里以字符串的形式传过来的,像这样:u'taskName'

我想按照这个格式来执行任务:

import fabfile tn = mydict['taskname'] # 这个任务名肯定在导入的fabfile里。 //做点什么让这个能工作: out = execute(tn) # 这显然是行不通的!

我知道execute需要一个任务对象。

有人能帮我把字符串(在tn里)转换成任务对象吗?或者如果我说错了,有人能帮我找出怎么调用fabfile里那个特定的任务吗?

1 个回答

0

如果你在执行某个语句时遇到错误,可能是因为你调用了一个不是函数的对象,或者用了一个不是任务名称的字符串。下面这个例子可以简单说明这个问题:

从 fabric.api 导入所有内容

@task
def foo():
    print "bar"


@task
def buzz():
    execute("foo")
    execute(foo)

注意,这段内容来自于 execute 的文档,它可以接受一个字符串(只要这个字符串对应的是一个用 @task 装饰的函数)或者直接使用函数对象(不需要任何装饰)。

执行的方式如下:

$ fab -f test.py buzz
bar
bar

Done.

另外要注意的是,从 execute() 调用中你不会得到运行的输出。再次查看文档中关于返回值的部分,它提到“返回一个字典,将主机字符串映射到该主机执行任务的返回值。”

撰写回答