在Fabric中,如何从另一个python文件执行任务?

时间:2014-05-12 09:28:34

标签: python fabric

我有一个fabfile(fabfile.py),声明了一些任务:

# fabfile.py
from fabric.api import *

@task
def start():
  # code

@task
def stop():
  # code

然后当我尝试使用面料中的执行函数调用任何这些任务时:

# main.py
from fabric.api import execute
from fabfile import * # I don't really know if this is necessary 
                      # or how should it be done
def main():
  execute('start')

它引发了这个错误:

Fatal error: None is not callable or a valid task name

我的目的是为fabfile中指定的某些任务创建一个包装器,可以用不同的参数调用,当你调用这个主程序时,必须从参数中获取要执行的任务,所以我无法显式调用该函数,但使用任务名称。

如何做到这一点?也许我误解了面料应该如何运作?

谢谢

2 个答案:

答案 0 :(得分:7)

execute('start')更改为execute(start)

我没有找到为什么传递一个taskname来执行不起作用,但有一个解决方法:

import fabfile
execute(getattr(fabfile, 'start'))

<强>更新 在阅读了一些代码并对结构进行了一些测试之后,我认为execute('task_name')只能在加载结构任务时使用。默认情况下,您可以在fabfile.py中使用它,如下所示:

@task
def task1():
    #do task1

@task
def task2():
    #do task2

@task
def task3():
    #do task1 and task2
    execute('task1')
    execute('task2')

然后,您可以使用fab task3一起执行task1task2。但到目前为止,我仍在使用布料工具。

再次更新: - )

然后我读了一些面料代码并发现了 使用fabric作为工具将调用fabric.main.main,调用fabric.main.load_fabfile从fabfile加载任务。

由于您使用python main.py来运行脚本,即使您导入了fabfile,也不会加载fab任务。所以我向你添加了一些代码main.py

docstring, callables, default = load_fabfile('fabfile.py')
state.commands.update(callables)

现在,execute('start')完全符合您的要求。

答案 1 :(得分:0)

无需始终使用fabfile.py。我们可以给fabfile命名。仅我们需要指定一个参数 --fabfile

Syntax:
fab --fabfile=<Your File Goes Here> function_name

Example:
fab --fabfile=test test_deploy