Skip to main content
 首页 » 编程设计

python之在 python Fabric 启动时隐式调用任务/函数

2025年05月04日10dflying

每次调用我都需要在 Fabric 中设置一些环境变量,到目前为止我正在做类似的事情:

env['FOO'] = 'one' 
 
@task 
def one(): 
    env['FOO'] = 'one' 
    print(cyan('Using FOO %s' % env['FOO'])) 
 
@task 
def two(): 
    env['FOO'] = 'two' 
    print(cyan('Using FOO %s' % env['FOO'])) 
 
@task 
def run(): 
    with shell_env(FOO=env['FOO']): 
    local(...) 
 
# more tasks that have the same pattern as run() above 

首先,我想提供一种更好的机制来自动设置 FOO,如果既没有调用“one”也没有调用“two”。也许每次 Fabric 运行时都会调用一些隐式的“设置”任务或方法?

此外,实际上还有更多的 FOO 设置(总共 10 个),是否有找不到任务时调用的通用任务/方法?像一个包罗万象的东西,比如:

def catchall(name, *args, **kwargs): 
    if name in ['one', 'two', ...]: 
        env['FOO'] = name 

请您参考如下方法:

您可以使您的任务成为具有作为参数传递的特定属性的自定义类的子类:

from fabric.api import task 
from fabric.tasks import Task 
 
class CustomTask(Task): 
    def __init__(self, func, *args, **kwargs): 
        super(CustomTask, self).__init__(*args, **kwargs) 
        self.func = func 
        self.foo = "one" 
 
    def run(self, *args, **kwargs): 
        return self.func(self.foo, *args, **kwargs) 
 
@task(task_class=CustomTask) 
def one(foo): 
    print(cyan('Using FOO %s' % foo))