【发布时间】:2018-05-04 08:19:02
【问题描述】:
在下面的代码中,我无法在操作(更新、黑名单、自动)之后添加 -v 和 -p 参数,可能是由于子解析器。我怎样才能做到以任何顺序添加这些可选参数?
parser = argparse.ArgumentParser(usage='pyfilter.py <file> <action> <options>')
parser.add_argument('file', help='blacklist file containing IPs', type=str)
subparsers = parser.add_subparsers(help='help', dest='action')
parser_update = subparsers.add_parser('update', help='update help')
parser_blacklist = subparsers.add_parser('blacklist', help='blacklist help')
parser_auto = subparsers.add_parser('auto', help='auto help')
parser_auto.add_argument('-i', '--interval', help='interval help')
parser.add_argument('-p', '--port', help='specify the port to block', type=int)
parser.add_argument('-v', '--verbose', help='write output to screen', nargs='?')
args = parser.parse_args()
根据解析器,这是有效的:
python3.5 testfilter.py /etc/blacklist.lst -p 22 -v yes update
而这会为“更新”之后的每个参数产生错误:
python3.5 testfilter.py /etc/blacklist.lst update -p 22 -v yes
【问题讨论】:
-
你看到了什么错误/
-
@AK47 错误:无法识别的参数:-v yes -p 22
-
我认为问题在于您需要将所有参数传递给您的
parser,然后再向下移动到subparsers,否则,知道您指的是哪个解析器意味着什么? -
如果您将选项放在
update之后,您的意思是它们应该是update的选项,而不是主解析器的选项。 -
@Chase,“喜欢 bash”? Bash 无法控制它调用的程序的行为方式,并且由于 GNU 工具允许您将选项放在位置参数之后,这样做是 active violation of POSIX utility syntax guidelines - 请参阅 #9。