我如何添加一个可选的标志,我的命令行参数?

如。这样我就可以写

python myprog.py 

or

python myprog.py -w

我试着

parser.add_argument('-w')

但是我得到了一条错误消息

Usage [-w W]
error: argument -w: expected one argument

我认为这意味着它想为-w选项提供一个参数值。接受一面旗帜是怎么回事?

我发现http://docs.python.org/library/argparse.html在这个问题上相当晦涩。


正如你所知道的,参数w期望在命令行上的-w后面有一个值。如果您只是想通过设置变量True或False来翻转开关,请查看这里(特别是store_true和store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

其中action='store_true'表示默认=False。

相反,你可以有action='store_false',这意味着default=True。


添加一个快速片段,让它准备好执行:

来源:myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

用法:

python myparser.py -w
>> True

这里有一个快速的方法,不需要任何东西,除了系统。尽管功能有限:

sys.argv[1:]中的Flag = "——Flag "

如果完整文件名是——flag,则为[1:]


你的剧本是对的。但默认为None类型。所以它认为除None以外的任何其他值都为真。argument_name变量。

我建议你添加一个action="store_true"。这将使True/False类型的标志。如果使用,则为True,否则为False。

import argparse
parser = argparse.ArgumentParser('parser-name')
parser.add_argument("-f","--flag",action="store_true",help="just a flag argument")

使用

$ python3 script.py -f

解析后,当检查args。F它返回true,

args = parser.parse_args()
print(args.f)
>>>true

如果你正在寻找一个二进制标志,那么argparse操作store_true或store_false提供的正是这个。这种方法在@Jdog给出的公认答案中得到了很好的解释。

官方文件也相当清楚。我只会用一行来完成这个例子,所以要非常清楚地说明store_true/store_false是如何作用的:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--fov', action='store_true')  # this is not in the docs!
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())  # --baz and --fov are missing
Out[4]: Namespace(bar=False, baz=True, foo=True, fov=False)  # mind the fov=False

稍微强大一点的方法是使用count动作。在运行命令时设置详细级别时,通常已经使用过这种类型的标志。

例如ssh的verbose模式标志-v是一个计数器:

-v详细模式。使ssh打印有关其进度的调试消息。这有助于调试连接、身份验证和配置问题。多个- v 选项增加了冗余。最大值为3。

所以如果你运行ssh,它不是冗长的,ssh -v是稍微冗长的,ssh -vvv是最冗长的。

使用python中的argparse,这样一个计数器标志可以定义如下:

parser.add_argument('--verbose', '-v', action='count', default=0)

如果你想使用它作为一个boolena (True/False)标志,那么你需要强制转换参数。Verbose转换为boolean。您可以显式地自己执行此操作,也可以依赖条件语句,如if args。详细:…

下面是一个完整的工作示例来说明如何使用counter标志:

使用脚本test.py:

#!/usr/bin/env python3
# test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='count', default=0)
args = parser.parse_args()

if args.verbose:
    print('verbose')
    print(f'verbosity level: {args.verbose}')
else:
    print('non-verbose')

您将得到以下输出:

python test.py 
>> non-verbose 

python test.py -v
>> verbose
>> verbosity level: 1

python test.py -vvv
>> verbose
>> verbosity level: 3