Python 关于使用结构时的argparse

Python 关于使用结构时的argparse,python,fabric,argparse,Python,Fabric,Argparse,我是python&fabric的新手。 我有一个python模块module1.py,它想要接受一个命令参数,我们在module1.py中使用argparse来需要一个命令行参数。 但是我们试图通过fabric运行整个程序,如果我在运行fab时直接指定命令行,我得到 mycode.py: error: argument --config_yaml is required 我怎样才能通过fab来传递这个论点 谢谢 我知道argparse,但不知道fabric。从错误中可以看出,您的脚本似乎定义了

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

mycode.py: error: argument --config_yaml is required
我怎样才能通过fab来传递这个论点


谢谢

我知道
argparse
,但不知道
fabric
。从错误中可以看出,您的脚本似乎定义了一个“--config_yaml”
argparse
参数(并将其设置为“必需”)。但是
fabric
显然也使用了这个参数名

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

是否需要在脚本中使用
--config_yaml
?为什么设置为
required=True
argparse
允许您指定
required
参数,但理想情况下,这样标记的参数是可选的。如果没有,他们应该有一个合理的违约


我在
fabric
API中看到一个
--config=…
参数,但没有看到
--config\u yaml

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


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

从这里可以看到:

你不能这么做。在运行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.
或者

警告不要调用它
--config
--这是一个内置参数

有了它,你仍然可以享受你仍然热爱的
面料
的一切,而且一切都没有改变

$ 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
这就是织物被创造出来的目的

它的意思是这样使用:

@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

为什么这个问题被标记为torando?在任何情况下,这都是由于fab(我不熟悉)没有将命令行参数传递到
module1.py
,而不是在结构下使用python或
argparse
,如果我指定--config_yaml,它将抱怨无法识别此标志:(fabric doc链接是否相关?我认为这不是真的,该文件中提到的参数应该在任务级别指定。但我认为Module1.py可以被其他文件重用,它应该能够接受自己的参数(无论在哪个程序中使用)听起来我们都在猜测
fabric
如何调用您的代码。
@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