我制作了一些使用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>
但没有成功。
答案 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>
时,我可以在那里加载我的论点
但是再一次,我觉得这不是正确的做法