argparse:在某些情况下将参数从位置更改为可选
我的脚本有以下用法:
prog.py login password [--show]
login
和password
是位置参数。 但是,如果指定了另一个参数( -s
或--show
),我想将它们转换为可选项。 所以,用法是:
prog.py --show [login] [password]
这是我的代码:
parser = argparse.ArgumentParser(...)
parser.add_argument('login', help="User login")
parser.add_argument('password', help="User password")
parser.add_argument('-s', '--show', dest='show', action='store_true',
help="Show user login and password")
例:
prog.py login=mylogin password=mypassword
该脚本将mylogin
和mypassword
保存到名为authorization.txt
的文件中
但是, prog.py --show
只应从authorization.txt
检索信息,而不需要login
和password
参数,并将当前用户登录名和密码输出到stdout:
login: mylogin
password: mypassword
我对argparse的经验有限,所以需要一点盐,但是这里有...
位置参数始终是必需的。 如果您的脚本没有明确要求它们完成所需的任何操作,那么根据定义,它们实际上是可选的。
另外,argparse不能随意处理变元结构的变化。 在parser.parse_args()
之前,它应该如何知道传递给它的参数?
考虑到这一点,我认为add_mutually_exclusive_group()
是你可能需要的东西https://docs.python.org/2/library/argparse.html#mutual-exclusion
这个想法是两个创建两个可选参数,其中只有一个可以在任何时候调用:
prog.py --store [login password] --show
这两者都是可选的(但我知道)。 如果您将required
标志设置为True
,则在运行prog.py
时,argparse将始终要求提供其中一个参数。 所以我们真正得到的是某种准选择性的立场论点。
注意:您不能将描述/帮助信息添加到互斥组合中......痛苦的一点。
argparse代码:
parser = argparse.ArgumentParser()
exclusive_group = parser.add_mutually_exclusive_group(required=True)
exclusive_group.add_argument('--store', dest='store', nargs=2, type=str,
help="Store user login and password")
exclusive_group.add_argument('--show', dest='show', action='store_true',
help="Show user login and password")
args = parser.parse_args()
print(args)
运行argparse代码:
$:python test.py --show
Namespace(show=True, store=None)
$:python test.py --store foo bar
Namespace(show=False, store=['foo', 'bar'])
编辑:我最初发布, nargs
不会允许一个整数值来定义允许的变量的数量,但感谢@hpaulj进行更正。
你可以使用nargs=2
,这意味着 - --store
必须被赋予2个参数,并且如果它没有得到2,则提供一个错误。目标store
因此是一个长度为2的列表。这不需要任何额外的验证代码的变量数量,但是,这并不能防止变量的排序。 由于它们存储在列表中,因此可以按任意顺序输入......所以要小心。
上一篇: argparse: change argument from positional to optional in certain cases
下一篇: Argparse: Required arguments listed under "optional arguments"?