Fabric fabfil执行模型ArgumentParser

时间:2016-07-11 14:51:37

标签: python parameter-passing fabric

我制作了一些使用Fabric的脚本,它使用ssh在多个服务器上做了一些工作。但我的脚本就像一个经典的python脚本

这是形状(它们的样子):my_script.py带有一些功能和一个主要的:

from fabric.api import *
from a_custom_class import *

def function1():
    #do stuff
def function2():
    #do stuff

def main():
    parser = ArgumentParser()
    parser.add_argument('-n', '--nolaunch', help='start the parsing', action='store_false')
    ...
    execute(function1)
    execute(function2)

if __name__ == "__main__":
        main()

所以要使用我的脚本我只做python my_script.py <my_options_for_ArgumentParser> 这非常有效。但我无法通过fab -f my_scrip.py main调用它。

编写脚本就像通常的&#39;脚本?或者有一种方法可以使用fab调用它而无需重写它?

当我尝试fab -f my_script.py main时,它会从我的脚本输出帮助(所以我觉得我接近某些东西):

usage fab [-h] [-n] [-g] [-m CARTO]

这些是我从scipt中选择的。但是,如果我试着用“通常的方式”来表示它并不是同样的方式。 python my_script.py -h

 -h, --help            show this help message and exit
 -n, --nolaunch        start the parsing
 -g, --html            generate the html
 -m CARTO, --carto CARTO  Do the carto stuff

调用真正的main只列出我的脚本fab -f my_script.py __main__中的函数,我可以调用任何函数:fab -f my_script.py my_function 但我无法弄清楚如何为ArgumentParser提供选项值。我尝试过这样的事情:fab -f my_script.py main:<myoptions>但没有成功。

1 个答案:

答案 0 :(得分:0)

我发现了一种方法。但它真的很难看。

#fabfile.py
import my_script as script

def task():
    execute(script.mainbis)

在my_script.py中,我在sys.argv上创建了一个mainbis()并调用main函数:

#my_script.py
def mainbis():
    # ask interactively the option
    # list_option=['--What', '--the', '--user', '--said']
    list_option.insert(0,my_script.py) #we need the script name as 1st argument
    sys.argv=list_option
    main()

现在我可以致电:fab task并在之后提供选项。你们认为这是可以接受的吗?

此外,织物中还有这个env.variable:

  

任务默认值:[]

     

将fab设置为要为当前执行的完整任务列表   执行命令。 仅供参考。

当我致电fab task --tasks=<my_options>时,我可以在那里加载我的论点 但是再一次,我觉得这不是正确的做法