簡體   English   中英

在Fabric中,如何從另一個python文件執行任務?

[英]In Fabric, how can I execute tasks from another python file?

我有一個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中指定的某些任務創建一個包裝器,可以使用不同的參數調用,並且當你調用這個主程序時必須從參數中獲取要執行的任務,所以我不能顯式調用該函數,但使用任務名稱。

怎么做? 也許我誤解了面料應該如何運作?

謝謝

更改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')完全按照您的意願工作。

總是不需要使用fabfile.py。 我們可以給fabfile任何名字。 只有我們需要指定一個參數--fabfile

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

Example:
fab --fabfile=test test_deploy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM