https://blog.****.net/lis_12/article/details/54618868
Python 详解命令行解析 - argparse
sys.argv
适合解析简单的命令行
filename = arg_sys.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
需要模块:sys
参数个数:len(sys.argv)
文件名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[2]
......
'''
import sys
print "file = ", sys.argv[0]
for i in range(1, len(sys.argv)):
print "parameter%s = %s"%(i, sys.argv[i])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
在dos输入python arg_sys.py 1 2 3 4 5
why choice argparse ?
2.7之后python不再对optparse模块进行扩展,推荐使用argparse模块对命令行进行解析。
来自*的说明
As of 2.7, optparse is deprecated, and will hopefully go away in the future.
argparse is better for all the reasons listed on its original page (http://code.google.com/p/argparse/):
- handling positional arguments
- supporting sub-commands
- allowing alternative option prefixes like + and /
- handling zero-or-more and one-or-more style arguments
- producing more informative usage messages
- providing a much simpler interface for custom types and actions
More information is also in PEP 389, which is the vehicle by which argparse made it into the standard library.
创建解析器 - ArgumentParser
import argparse
parser = argparse.ArgumentParser()
- 1
- 2
class ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
- 1
创建一个ArgumentParser实例,ArgumentParser的参数都为关键字参数。
prog :文件名,默认为sys.argv[0],用来在help信息中描述程序的名称。
usage :描述程序用途的字符串
description :help信息前显示的信息
epilog :help信息之后显示的信息
>>> parser = argparse.ArgumentParser(prog='my - program', usage='%(prog)s [options] usage',description = 'my - description',epilog = 'my - epilog')
>>> parser.print_help()
usage: my - program [options] usage
my - description
optional arguments:
-h, --help show this help message and exit
my - epilog
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
parents :由ArgumentParser对象组成的列表,它们的arguments选项会被包含到新ArgumentParser对象中。(类似于继承)
formatter_class :help信息输出的格式,为了美观…
prefix_chars :参数前缀,默认为’-‘(最好不要修改)
>>> parser = argparse.ArgumentParser(prefix_chars='+')
>>> parser.add_argument('+x')
>>> parser.add_argument('++y')
>>> parser.parse_args('+x 1 ++y 2'.split())
Namespace(x='1', y='2')
>>> parser.parse_args('-x 2'.split())
usage: [+h] [+x X] [++y Y]
: error: unrecognized arguments: -x 2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
fromfile_prefix_chars :前缀字符,放在文件名之前
>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'tmp', '@args.txt'])
Namespace(f='bar')
- 1
- 2
- 3
- 4
- 5
- 6
当参数过多时,可以将参数放到文件中读取,例子中parser.parse_args([‘-f’, ‘foo’, ‘@args.txt’])解析时会从文件args.txt读取,相当于 [‘-f’, ‘foo’, ‘-f’, ‘bar’]
conflict_handler :解决冲突的策略,默认情况下冲突会发生错误,(最好不要修改)
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
- 1
- 2
- 3
- 4
- 5
- 6
add_help :是否增加-h/-help选项 (默认为True),一般help信息都是必须的。设为False时,help信息里面不再显示-h –help信息
argument_default: - (default: None)设置一个全局的选项的缺省值,一般每个选项单独设置,基本没用
添加参数选项 - add_argument
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
- 1
name or flags :参数有两种,可选参数和位置参数。
-
添加可选参数
>>> parser.add_argument('-f', '--foo')
- 1
-
添加位置参数
>>> parser.add_argument('bar')
- 1
parse_args()运行时,默认会用’-‘来认证可选参数,剩下的即为位置参数。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('name')
>>> parser.add_argument('-a', '--age')
>>> parser.parse_args(['xiaoming'])
Namespace(age=None, name='xiaoming')
>>> parser.parse_args(['xiaoming','-a','123'])
Namespace(age='123', name='xiaoming')
>>> parser.parse_args(['-a','123'])
usage: [-h] [-a AGE] name
: error: too few arguments
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解析时缺少位置参数就会报错了
action: 默认为store
-
store_const:值存放在const中:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args('--foo'.split())
Namespace(foo=42)- 1
- 2
- 3
- 4
-
store_true和store_false:值存为True或False
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_false')
>>> parser.add_argument('-z', action='store_false')
>>> parser.parse_args('-x -y'.split())
Namespace(x=True, y=False, z=True)- 1
- 2
- 3
- 4
- 5
- 6
-
append:存为列表,可以有多个参数
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--l', action='append')
>>> parser.parse_args('--l 1 --l 2'.split())
Namespace(l=['1', '2'])- 1
- 2
- 3
- 4
-
append_const:存为列表,会根据const关键参数进行添加:
>>> 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 --str --int'.split())
Namespace(l=None, types=[<type 'str'>, <type 'int'>, <type 'str'>, <type 'int'>])- 1
- 2
- 3
- 4
- 5
-
count:统计参数出现的次数
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--counte', '-c', action='count')
>>> parser.parse_args('-cccc'.split())
Namespace(counte=4)- 1
- 2
- 3
- 4
help: help信息
-
version:版本
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--version', action='version', version='version 2.0')
>>> parser.parse_args(['--version'])
version 2.0- 1
- 2
- 3
- 4
metaver:帮助信息中显示的参数名称
nargs: 参数的数量
-
值可以为整数N(N个),
*
(任意多个,可以为0个),+
(一个或更多),有点像正则表达式啊>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-x', nargs='*')
>>> parser.add_argument('-y', nargs='*')
>>> parser.add_argument('-z', nargs='*')
>>> parser.parse_args('1 2 -x 3 4 -y 5 6'.split())
Namespace(x=['3', '4'], y=['5', '6'], z=['1', '2'])- 1
- 2
- 3
- 4
- 5
- 6
-
值为
?
时,首先从命令行获得参数,如果有-y
后面没加参数,则从const中取值,如果没有-y
,则从default中取值>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x', nargs='?',default='default')
>>> parser.add_argument('-y', nargs='?',const='const', default='default')
>>> parser.parse_args('1 -y 2'.split())
Namespace(x='1', y='2')
>>> parser.parse_args('1 -y'.split())
Namespace(x='1', y='const')
>>> parser.parse_args([])
Namespace(x='default', y='default')- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
const :保存一个常量
default :默认值
type :参数类型,默认为str
choices :设置参数值的范围,如果choices中的类型不是字符串,记得指定type
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x', type=int, choices=range(1, 4))
>>> parser.parse_args(['3'])
Namespace(x=3)
>>> parser.parse_args(['4'])
usage: [-h] {1,2,3}
: error: argument x: invalid choice: 4 (choose from 1, 2, 3)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
required :该选项是否必选,默认为True
dest :参数名
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='f_name')
>>> parser.parse_args('--foo XXX'.split())
Namespace(f_name='XXX')
- 1
- 2
- 3
- 4
解析参数
像名称空间一样使用即可
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x')
>>> a = parser.parse_args(['1'])
>>> a
Namespace(x='1')
>>> type(a)
<class 'argparse.Namespace'>
>>> a.x
'1'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
example
filename = argv_argparse.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import argparse
def cmd():
args = argparse.ArgumentParser(description = 'Personal Information ',epilog = 'Information end ')
#必写属性,第一位
args.add_argument("name", type = str, help = "Your name")
#必写属性,第二位
args.add_argument("birth", type = str, help = "birthday")
#可选属性,默认为None
args.add_argument("-r",'--race', type = str, dest = "race", help = u"民族")
#可选属性,默认为0,范围必须在0~150
args.add_argument("-a", "--age", type = int, dest = "age", help = "Your age", default = 0, choices=range(150))
#可选属性,默认为male
args.add_argument('-g',"--gender", type = str, dest = "gender", help = 'Your gender', default = 'male', choices=['male', 'female'])
#可选属性,默认为None,-p后可接多个参数
args.add_argument("-p","--parent",type = str, dest = 'parent', help = "Your parent", default = "None", nargs = '*')
#可选属性,默认为None,-o后可接多个参数
args.add_argument("-o","--other", type = str, dest = 'other', help = "other Information",required = False,nargs = '*')
args = args.parse_args()#返回一个命名空间,如果想要使用变量,可用args.attr
print "argparse.args=",args,type(args)
print 'name = %s'%args.name
d = args.__dict__
for key,value in d.iteritems():
print '%s = %s'%(key,value)
if __name__=="__main__":
cmd()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
dos输入命令示例:
python argv_argparse.py -h
python argv_argparse.py xiaoming 1991.11.11
python argv_argparse.py xiaoming 1991.11.11 -p xiaohong xiaohei -a 25 -r han -g female -o 1 2 3 4 5 6
转载请标明出处,原文地址(http://blog.****.net/lis_12/article/details/54618868).
如果觉得本文对您有帮助,请点击顶
支持一下,您的支持是我写作最大的动力,谢谢。
参考网址