我的脚本有以下用法:
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
答案 0 :(得分:3)
我对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
,则argparse将始终要求在运行prog.py
时显示其中一个参数。所以我们真正获得的是某种准可选位置论证。
N.B。您不能将描述/帮助信息添加到互斥组中......有点痛苦。
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的列表这无需任何额外的代码来验证变量的数量,但这并不能防止变量的排序。由于它们存储在列表中,因此可以按任何顺序输入......所以要小心。