python命令行解析工具argparse模块【3】
上一节,我们讲解了ArgumentParser对象,这一节我们将学习这个对象的add_argument()方法。
>>> parser.add_argument('-f','--foo')
>>> parser.add_argument('bar')
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f','--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR','--foo','FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo','FOO'])
usage: PROG [-h][-f FOO] bar
PROG: error: too few arguments
2.action
action参数指定了参数是如何被处理的。支持额操作如下:
store:这个只是简单的存储这个参数值,这也是默认操作。
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='')
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('--foo',action='store_const',const=42)
>>> parser.parse_args('--foo'.split())
Namespace(foo=42)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(bar=False, foo=True)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['',''])
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<type 'str'>,<type 'int'>])
>>>import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0
>>> classFooAction(argparse.Action):
... def__call__(self,parser,namespace,values,option_string=None):
... print'%r%r%r'%(namespace,values,option_string)
... setattr(namespace,self.dest,values)
...
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('--foo',action=FooAction)
>>> parser.add_argument('bar',action=FooAction)
>>> args=parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None)''None
Namespace(bar='', foo=None)'''--foo'
>>> args
Namespace(bar='', foo='')
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a','b'])
Note that ``nargs=1`` produces a list of one item.Thisis different from
the default,in which the item is produced by itself.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args('XX --foo YY'.split())
Namespace(bar='XX', foo='YY')
>>> parser.parse_args('XX --foo'.split())
Namespace(bar='XX', foo='c')
>>> parser.parse_args(''.split())
Namespace(bar='d', foo='d')
另外一种情况是通过?来支持可选的输入输出文件。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
>>> parser.parse_args(['input.txt','output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>, outfile=<open file 'output.txt', mode 'w' at 0x...>)
>>> parser.parse_args([])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>, outfile=<open file '<stdout>', mode 'w' at 0x...>)
"*":支持多个参数值。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['',''], baz=['a','b'], foo=['x','y'])
"+" :跟*的作用类似,但是如果没有提供参数的会报错。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args('a b'.split())
Namespace(foo=['a','b'])
>>> parser.parse_args(''.split())
usage: PROG [-h] foo [foo ...]
PROG: error: too few arguments
如果没有提供nargs参数的话,参数个数将由action来决定,默认情况下同单个参数。
4.const
const保存的值为不需要从命令行中读取但是对于ArgumentParser对象的action操作来说又必须的值。一般用于以下两个用途。
当action='store_const'或者action="append_const"的时候
当使用可选参数,并且narg=?的时候,并且命令行参数没有给出可选字符串以及可选参数的时候。
5.default
default设置默认值。如果可选参数没有提供可选字符串。则
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args('--foo 2'.split())
Namespace(foo='')
>>> parser.parse_args(''.split())
Namespace(foo=42)
对于带nargs=?或者*的位置参数,当命令行参数没有提供的时候将使用默认值。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args('a'.split())
Namespace(foo='a')
>>> parser.parse_args(''.split())
Namespace(foo=42)
如果提供default=argparse.SUPPRESS的话,这时不会有任何属性添加到命名空间。
6.type
默认情况下下,ArgumentParser将从命令行中读取的参数视为string类型,但是有时候也可以指定为其他类型。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', type=int)
>>> parser.add_argument('bar', type=file)
>>> parser.parse_args('2 temp.txt'.split())
Namespace(bar=<open file 'temp.txt', mode 'r' at 0x...>, foo=2)
为了简便文件参数的使用,argparser模块提供了FileType类工厂。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar', type=argparse.FileType('w'))
>>> parser.parse_args(['out.txt'])
Namespace(bar=<open file 'out.txt', mode 'w' at 0x...>)
type属性还可以接收一个回调函数,这个回调函数接收一个命令行参数并返回转换类型之后的值
>>>def perfect_square(string):
... value = int(string)
... sqrt = math.sqrt(value)
... if sqrt != int(sqrt):
... msg ="%r is not a perfect square"% string
... raise argparse.ArgumentTypeError(msg)
... return value
...
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', type=perfect_square)
>>> parser.parse_args(''.split())
Namespace(foo=9)
>>> parser.parse_args(''.split())
usage: PROG [-h] foo
PROG: error: argument foo:''isnot a perfect square
如果提供choices参数的话,可以检测值的范围。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', type=int, choices=xrange(5,10))
>>> parser.parse_args(''.split())
Namespace(foo=7)
>>> parser.parse_args(''.split())
usage: PROG [-h]{5,6,7,8,9}
PROG: error: argument foo: invalid choice:11(choose from5,6,7,8,9)
7.choices
有时候需要限制参数在某个范围之内,这时可以通过choices提供这个参数范围,如果提供的参数值不在这个范围之内,那么会报错。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', choices='abc')
>>> parser.parse_args('c'.split())
Namespace(foo='c')
>>> parser.parse_args('X'.split())
usage: PROG [-h]{a,b,c}
PROG: error: argument foo: invalid choice:'X'(choose from'a','b','c')
注意,如果包含type参数的话,只有type参数的条件满足之后才会检查给定的参数值是否在choices之内。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', type=complex, choices=[1,1j])
>>> parser.parse_args('1j'.split())
Namespace(foo=1j)
>>> parser.parse_args('-- -4'.split())
usage: PROG [-h]{1,1j}
PROG: error: argument foo: invalid choice:(-4+0j)(choose from1,1j)
所有支持in运算符的对象都可以赋给choices,所以dict、set、list都可以。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo','BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: argparse.py [-h][--foo FOO]
argparse.py: error: option --foo is required
如果设置了required为真,并且也没有提供这个参数值,则报错。
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', action='store_true',
... help='foo the bars before frobbling')
>>> parser.add_argument('bar', nargs='+',
... help='one of the bars to be frobbled')
>>> parser.parse_args('-h'.split())
usage: frobble [-h][--foo] bar [bar ...]
positional arguments:
bar one of the bars to be frobbled
optional arguments:
-h,--help show this help message and exit
--foo foo the bars before frobbling
help中可以使用格式化信息。例如
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('bar', nargs='?', type=int, default=42,
... help='the bar to %(prog)s (default: %(default)s)')
>>> parser.print_help()
usage: frobble [-h][bar]
positional arguments:
bar the bar to frobble (default:42)
optional arguments:
-h,--help show this help message and exit
10.metavar
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:[-h][--foo FOO] bar
positional arguments:
bar
optional arguments:
-h,--help show this help message and exit
--foo FOO
除此之外,还可以通过metavar指定别名。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:[-h][--foo YYY] XXX
positional arguments:
XXX
optional arguments:
-h,--help show this help message and exit
--foo YYY
注意metavar只改变显示的名字,不同的nargs参数值,可能导致metavar参数需要使用多次,这时可以提供metavar参数来生成不同的显示。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar','baz'))
>>> parser.print_help()
usage: PROG [-h][-x X X][--foo bar baz]
optional arguments:
-h,--help show this help message and exit
-x X X
--foo bar baz
11.dest
ArgumentParser对象通过dest来指定要传入的参数值。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args('XXX'.split())
Namespace(bar='XXX')
对于可选参数,dest的值根据可选参数的不同而相应改变,如果是完整字符串,使用去掉--前缀之后的字符串,如果是简短名,则使用去除-前缀之后的字符串,如果字符串中间带有-,则将-替换成_以使这个字符串合法。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f','--foo-bar','--foo')
>>> parser.add_argument('-x','-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='', x='')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='', x='')
dest允许设置自定义名字:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
python命令行解析工具argparse模块【3】的更多相关文章
- python命令行解析工具argparse模块【1】
argpaser是python中很好用的一个命令行解析模块,使用它我们可以很方便的创建用户友好型命令行程序.而且argparse会自动生成帮助信息和错误信息. 一.示例 例如下面的例子,从命令行中获取 ...
- python命令行解析工具argparse模块【2】
上一节,我们简要的介绍了argparse的用法,接下来几节,将详细讲解其中的参数及用法,这一节我们讲解ArgumentParser对象. argparse.ArgumentParser([descri ...
- python命令行解析工具argparse模块【5】
上一节我们学习了parse_args()的用法,这一节,我们将继续学习argparse的其他一些用法. 1.sub-commands子命令 argpar ...
- python命令行解析工具argparse模块【4】
上一节我们讲解了add_argument()方法,这一节我们将学习parse_args()方法. parse_args()方法的作用是解析命令行参数,并返回解析之后的 ...
- Python 命令行解析工具 Argparse介绍
最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具. 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题 ...
- python之命令行解析工具argparse
以前写python的时候都会自己在文件开头写一个usgae函数,用来加上各种注释,给用这个脚本的人提供帮助文档. 今天才知道原来python已经有一个自带的命令行解析工具argparse,用了一下,效 ...
- Python命令行解析库argparse
2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse模块对命令行进行解析. 1.example 有一道面试题:编写一个脚本main.py,使用方式如下: ...
- Python命令行解析库argparse(转)
原文:http://www.cnblogs.com/linxiyue/p/3908623.html 2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse ...
- 【python】命令行解析工具argparse用法
python的命令行参数 之前有用到optget, optparse, 现在这些都被弃用了. import argparse parser = argparse.ArgumentParser() ar ...
随机推荐
- Windows 取得至高无上的权限
第一步:gpedit.msc 第二步:计算机配置-->windows 设置 -->安全设置 -->安全选项 -->用户账户控制 -->以管理员批准模式运行所有管理员 -- ...
- QPointer很大程度上避免了野指针(使用if语句判断即可,类似于dynamic_cast),而且使用非常方便 good
QPointer 如何翻译呢?我不太清楚,保留英文吧. The QPointer class is a template class that provides guarded pointers ...
- Win7下超级管理员创建普通权限任务
已转至新的博客 http://www.raysoftware点击打开链接.cn/?p=49 项目中用到一个功能,Win7下超级管理员创建普通权限任务. 试了几种办法,例如获取资源管理器的Token,然 ...
- 去掉android的屏幕上的title bar
在配置文件里修改 (关键代码:android:theme="@android:style/Theme.NoTitleBar.Fullscreen",如果想只是去除标题栏就后面不用加 ...
- mysql 更改自动增长列的初始值
alter table t_Myxiao7 AUTO_INCREMENT 3; -- 从三开始 ITOKIT.COM提示:如果表中数据没有用.如果直接删除数据,自动增长ID还是不会从1开始的,可以 ...
- iOS 中UITableViewController 中tableView 会被状态栏覆盖的问题
解决办法在 生命周期函数viewDidAppear中设置即可 - (void)viewDidAppear:(BOOL)animated { self.tableView.frame = CGRectM ...
- 怎样用Excel自动排成绩
经常需要做表格,排成绩名次总是笨笨的一个一个填,费时又费力,终于找到了解决的办法%>_<%(不要嘲笑我了(✿◡‿◡)),原来就是一个名叫RANK的函数,还在苦逼地自己输的小伙伴们,快来看吧 ...
- Problem D Ananagrams(map的使用)
题目链接:Problem D 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另一个单词.在判断是否满足条件时,字母不区分大小写. 但是输出时应保留原始大小写, ...
- javascript 作用域链
最近想整理一下js执行代码的一些知识,如果有出错的地方还请指正. 执行环境(Execution Context) 所有的javascript代码都是在一个执行环境中被执行的.它只是一种机制,用来完成运 ...
- Loadrunner11点击录制脚本无响应,IE页面弹不出——解决方案汇总
以前用Loadrunner的时候都没有遇到过这个问题,后来将服务器重装系统(win7)后,重新安装Loadrunner11,浏览器版本刚开始为IE11,后来降为IE8,IE访问部署在虚拟机里的平台能正 ...