关于使用面料的argparse

时间:2015-10-11 15:56:01

标签: python fabric argparse

我是python&的新手布。 我有一个python模块module1.py,它想要接受一个命令参数,我们在module1.py中使用argparse来要求一个命令行参数。 但是我们试图通过结构运行整个程序,如果我在运行fab时直接指定命令行,我得到了

mycode.py: error: argument --config_yaml is required

我怎么能通过fab传递参数?

谢谢!

2 个答案:

答案 0 :(得分:1)

从我在这里可以看到:

https://github.com/fabric/fabric/blob/master/fabric/main.py#L340 https://github.com/fabric/fabric/blob/master/fabric/main.py#L619

你不能这样做。在main.py运行之前,您无法向env_options添加内容,fabfile.py中的代码将在main()处理后运行。

但你可以这样做:

重命名fabfile.py - >无论你想要什么,只要它不是fabric.py。我打电话给我fabricc.py

from fabric.state import env_options, make_option

env_options.append(make_option('--myconfig', dest='config_file', default='default.ini'))

from fabric import main
from fabric.api import task, env

@task
def do_something():
    print('config file: {}'.format(env.config_file))


if __name__ == '__main__':
    main.find_fabfile = lambda x: __file__
    main.main()

现在运行它:

$ python fabricc.py do_something
config file: default.ini

Done.

或..

$ python fabricc.py do_something --myconfig=somethinelse.ini
config file: somethinelse.ini

Done.

警告词不要称之为--config - 这是一个内置的参数。

有了这个,你仍然可以享受你仍然喜欢的一切fabric并且没有任何改变。

$ python fabricc.py do_something --help
Usage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...

Options:
  -h, --help            show this help message and exit
  -d NAME, --display=NAME
...
  -z INT, --pool-size=INT
                        number of concurrent processes to use in parallel mode
  --myconfig=CONFIG_FILE

PS。我不建议你做织物覆盖手动处理它。我只是告诉你它可以完成。 (我不容忍这一点的原因是:兼容性。如果版本明天更改,可能中断)最好使用该产品的作者如何使用它。

=============================================== =====================

此外,面料是一个花哨的orm建设者 - 缺乏一个更好的词。你不能在每个任务的基础上拥有命令行参数,它不像那样工作。但它被设计为接受任务函数参数:

@task
def do_something(file=None):
    print('config file: {}'.format(file or 'default.ini'))

$ fab dosomething:test
config file: override.ini

Done.

这就是创建面料的目的。

它意味着像这样使用:

@task
def environment(box_env=None):
    ...

@task
def deploy(branch='master'):
    ...

@task
def provision(recreate_if_existing=False, start_nignx=True):
    ...

fab evironment:dev deploy:development

fab evironment:dev provision:True,False

一起。

fab evironment:dev provision deploy:development

答案 1 :(得分:0)

我知道argparse,但不知道fabric。从错误看起来您的脚本定义了一个&#39; - config_yaml&#39; argparse论证(并使其成为&#39;必需&#39;)。但fabric显然也使用了该参数名称。

我不知道fabric是否也使用argparse。但是像这样的程序通常会剥离它所期望的命令行参数,并将其余部分传递给你的代码。

您是否需要在脚本中使用--config_yaml?为什么设置为required=Trueargparse允许您指定required参数,但理想情况下标记的参数是可选的。如果没有给出,他们应该有合理的默认值。

我在--config=... API中看到fabric参数,但不是--config_yaml

我想知道关于每个任务参数的这一部分是否相关

http://docs.fabfile.org/en/1.10/usage/fab.html#per-task-arguments

听起来您需要将任务名称添加到参数中。 fabric并不会将所有未知参数传递给任务(这是我上面假设的)。但我没有安装fabric,因此无法对其进行测试。