arg包含一个操作字段和可选的开关,用于修改操作的行为。
argparse代码如下所示:
parser=argparse.ArgumentParser()
parser.add-argument('action',metavar='action', choices=['analysis','report','update'],nargs='?', default='report')
parser.add-argument('-d',dest='delay',type=int, choices=range(1,10),default=1)
parser.add-argument('-v',dest='verbose',action='store-true',default=False)
parser.add-argument('-o',dest='offline',action='store-true',default=False)
parser.add-argument('-n',dest='names',required=False)
我想让切换选项-o,-d,-v仅适用于action = report,而选项-n仅适用于action = analysis。
我知道有一个相互的组设置,但它只是为参数设置而不是参数值!
btw,argparse支持组合选项,如-vo ...... ???
答案 0 :(得分:2)
首先:是的,支持像-vo这样的组合选项
现在进行动作切换: 将SubParser添加到ArgumentParser非常符合您的要求。 请参阅argparse文档中的15.4.5.1. Sub-commands部分,一切都有详细解释,并以示例为例
编辑: 我知道请参阅此帖子下面的评论: 如果你没有在程序调用中提供子命令参数,那么解析器通常会给你一个关于如何使用该程序的建议,然后退出一个"太少的参数错误" 我重写了你的代码以显示这个
<强> test.py 强>
import argparse
parser=argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='sub-command help')
parser_analysis = subparsers.add_parser('analysis', help='analysis help text')
parser_analysis.add_argument('-n',dest='names',required=False)
parser_report = subparsers.add_parser('report', help='report help text')
parser_report.add_argument('-d',dest='delay',type=int, choices=range(1,10),default=1)
parser_report.add_argument('-v',dest='verbose',action='store_true',default=False)
parser_report.add_argument('-o',dest='offline',action='store_true',default=False)
parser_update = subparsers.add_parser('update', help='update help text')
parser.parse_args()
现在有些test.py
调用了不同的参数:
$python test.py
usage: test.py [-h] {analysis,report,update} ...
test.py: error: too few arguments
$python test.py -h
usage: test.py [-h] {analysis,report,update} ...
positional arguments:
{analysis,report,update}
sub-command help
analysis analysis help text
report report help text
update update help text
optional arguments:
-h, --help show this help message and exit
$python test.py report -h
usage: test.py report [-h] [-d {1,2,3,4,5,6,7,8,9}] [-v] [-o]
optional arguments:
-h, --help show this help message and exit
-d {1,2,3,4,5,6,7,8,9}
-v
-o
因此,我认为唯一的问题是程序在调用python test.py
而没有任何子命令后抛出错误。所以我会做s.th.像这样
try:
args=parser.parse_args()
except:
exit(0)
以避免用户发现存在未处理的错误。然后,您具有与svn
命令相同的行为。
如果要以执行默认子命令的方式处理此问题,则必须执行s.th.就像这篇帖子中提到的那样:
Argparse - How to Specify a Default Subcommand
import sys
#...your parser definitions
if (len(sys.argv) < 2):
args = parser.parse_args(['update'])
else:
args = parser.parse_args()
如果update
中的参数列表小于2,这将解析命令sys.argv
。为什么2?因为参数列表中的第一个参数始终是您调用的程序,即test.py
问题是,你真的想要这种行为吗?因为如果我总是可以调用test.py update
,则无需调用test.py
,因此用户可能会变得懒惰并且从不使用test.py update
命令。此外,如果您以后想要一个不同的默认行为,如test.py
启动交互模式,那么用于调用test.py
进行更新的用户将会感到困惑,或者他们使用您的程序的脚本会被破坏。