适合解析简单的命令行
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])
在dos输入python arg_sys.py 1 2 3 4 5
2.7之后python不再对optparse模块进行扩展,推荐使用argparse模块对命令行进行解析。
来自stackoverflow的说明
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.
import argparse
parser = argparse.ArgumentParser()
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)
创建一个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
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
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')
当参数过多时,可以将参数放到文件中读取,例子中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
add_help :是否增加-h/-help选项 (默认为True),一般help信息都是必须的。设为False时,help信息里面不再显示-h –help信息
argument_default: - (default: None)设置一个全局的选项的缺省值,一般每个选项单独设置,基本没用
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name or flags :参数有两种,可选参数和位置参数。
添加可选参数
>>> parser.add_argument('-f', '--foo')
添加位置参数
>>> parser.add_argument('bar')
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
解析时缺少位置参数就会报错了
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)
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)
append:存为列表,可以有多个参数
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--l', action='append')
>>> parser.parse_args('--l 1 --l 2'.split())
Namespace(l=['1', '2'])
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=['str'>, 'int'>, 'str'>, 'int'>])
count:统计参数出现的次数
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--counte', '-c', action='count')
>>> parser.parse_args('-cccc'.split())
Namespace(counte=4)
help: help信息
version:版本
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--version', action='version', version='version 2.0')
>>> parser.parse_args(['--version'])
version 2.0
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'])
值为?
时,首先从命令行获得参数,如果有-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')
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)
required :该选项是否必选,默认为True
dest :参数名
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='f_name')
>>> parser.parse_args('--foo XXX'.split())
Namespace(f_name='XXX')
像名称空间一样使用即可
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x')
>>> a = parser.parse_args(['1'])
>>> a
Namespace(x='1')
>>> type(a)
<class 'argparse.Namespace'>
>>> a.x
'1'
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()
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.csdn.net/lis_12/article/details/54618868).
如果觉得本文对您有帮助,请点击顶
支持一下,您的支持是我写作最大的动力,谢谢。
参考网址