argparse:要求可选参数位于位置参数之前
argparse: require optional arguments to precede positional arguments
我有一个 Python 脚本,它包装了 openssh 客户端二进制文件,需要以相同的方式解析参数。我正在使用 argparse。
使用 ssh,这意味着连接到主机,以 "a" 身份登录,并且 运行 "ls"。
ssh -la host ls
虽然这意味着连接到主机并且 运行 "ls -la":
ssh host ls -la
argparse 将它们视为相同。有没有一种惯用的方式告诉 argparse 可选参数必须在位置参数之前?
我认为您要完成的工作非常符合 argparse
子命令的概念。看一看:https://docs.python.org/3/library/argparse.html#sub-commands
使用nargs=argparse.REMAINDER
:
import argparse
p = argparse.ArgumentParser()
p.add_argument('-l', '--login')
p.add_argument('host')
p.add_argument('cmd', nargs=argparse.REMAINDER)
print p.parse_args('-la server ls'.split())
print p.parse_args('server ls -la'.split())
结果:
Namespace(cmd=['ls'], host='server', login='a')
Namespace(cmd=['ls', '-la'], host='server', login=None)
我有一个 Python 脚本,它包装了 openssh 客户端二进制文件,需要以相同的方式解析参数。我正在使用 argparse。
使用 ssh,这意味着连接到主机,以 "a" 身份登录,并且 运行 "ls"。
ssh -la host ls
虽然这意味着连接到主机并且 运行 "ls -la":
ssh host ls -la
argparse 将它们视为相同。有没有一种惯用的方式告诉 argparse 可选参数必须在位置参数之前?
我认为您要完成的工作非常符合 argparse
子命令的概念。看一看:https://docs.python.org/3/library/argparse.html#sub-commands
使用nargs=argparse.REMAINDER
:
import argparse
p = argparse.ArgumentParser()
p.add_argument('-l', '--login')
p.add_argument('host')
p.add_argument('cmd', nargs=argparse.REMAINDER)
print p.parse_args('-la server ls'.split())
print p.parse_args('server ls -la'.split())
结果:
Namespace(cmd=['ls'], host='server', login='a')
Namespace(cmd=['ls', '-la'], host='server', login=None)