本文研究的主要是Python命令行解析模块的相关内容,具体如下。
Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块。下面就解读下这两种解析器。
getopt模块
这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:]。它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数)。这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError)。
这里重点介绍getopt.getopt()这个函数。
函数原型:getopt.getopt(args, options[, long_options])
这个函数有三个参数:
- args:脚本要解析的命令行参数;
- options:命令行短选项,如果指定的短选项后面需要跟参数的话,要在相应短选项后面加“:”,如e:;
- long_options:命令行长选项,这个参数是可选的。如果指定的长选项后面要跟参数的话,要在相应长选项后面加上“=”,如conding=;
当给定的命令行参数解析不了的话,就会抛出GetoptError异常。
函数的返回值包含两个元素:
- 第一个元素是一个(option,value)元组对。Option是解析的参数,value是对应参数的值;
- 第二个元素是脚本不需要执行的参数列表。也就是这些参数是多余的;
下面看几个Demo:
短选项:
> importgetopt > args='-a -b -cfoo -d bar a1 a2'.split() > args ['-a', '-b', '-cfoo', '-d', 'bar', 'a1','a2'] > optlist, args= getopt.getopt(args,'abc:d:') > optlist [('-a', ''), ('-b', ''), ('-c', 'foo'),('-d', 'bar')] > args ['a1', 'a2']
长选项:
> s='--condition=foo --testing --output-file abc.def -x a1 a2' > args= s.split() > args ['--condition=foo', '--testing','--output-file', 'abc.def', '-x', 'a1', 'a2'] > optlist, args= getopt.getopt(args,'x', [ ... 'condition=','output-file=','testing']) > optlist [('--condition', 'foo'), ('--testing', ''),('--output-file', 'abc.def'), ('-x', '')] > args ['a1', 'a2']
在脚本当中经典的应用实例:
importgetopt,sys defmain(): try: opts, args = getopt.getopt(sys.argv[1:],"ho:v", ["help","output="]) except getopt.GetoptErroras err: # print help information and exit: printstr(err) # will print something like "option -a not recognized" usage() sys.exit(2) output =None verbose =False for o, a in opts: if o =="-v": verbose =True elif o in ("-h","--help"): usage() sys.exit() elif o in ("-o","--output"): output = a else: assertFalse,"unhandled option" # ... if __name__ =="__main__": main()
argparse模块
argparse模块使得编写用户友好的命令行接口非常容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。
使用argparse模块一般需要三个步骤:
1. 创建一个解析器
使用argparse的第一步是创建一个ArgumentParser对象:
> parser= argparse.ArgumentParser()
ArgumentParser对象会保存把命令行解析成Python数据类型所需要的所有信息。
2. 添加参数
通过调用add_argument()方法向ArgumentParser添加程序的参数信息。通常情况下,这些信息告诉ArgumentParser如何接收命令行上的字符串并将它们转换成对象。这些信息被保存下来并在调用parse_args()时用到。例如:
> parser.add_argument('--name', help='username') > parser.add_argument('--pass', help='password ')
接下来,调用parse_args()返回的对象将带有两个属性,name和pass。分别保存着用户名与密码。
3. 解析参数
ArgumentParser通过parse_args()方法解析参数。它将检查命令行,把每个参数转换成恰当的类型并采取恰当的动作。在大部分情况下,这意味着将从命令行中解析出来的属性建立一个简单的 Namespace对象。
> argments = parser.parse_args(['--name','li','--pass','si'])
在脚本中,parse_args()
调用一般不带参数,ArgumentParser
将根据sys.argv
自动确定命令行参数。
ArgumentParser 对象
class argparse.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)
创建一个新的argmentParserr对象。所有的参数应该以关键字参数传递。下面有对每个参数各自详细的描述,但是简短地讲它们是:
- prog - 程序的名字(默认:sys.argv[0])
- useage - 描述程序用法的字符串(默认:从解析器的参数生成)
- description - 参数帮助信息之前的文本(默认:空)
- epilog- 参数帮助信息之后的文本(默认:空)
- parents - ArgmentParser 对象的一个列表,这些对象的参数应该包括进去
- ormatter_class - 定制化帮助信息的类
- prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
- fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
- argument_default - 参数的全局默认值(默认:None)
- conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
- add_help - 给解析器添加-h/–help 选项(默认:True)
add_argument() 方法
ArgumentParser.add_argument(nameor flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][,metavar][, dest])
定义应该如何解析一个命令行参数。下面每个参数有它们自己详细的描述,简单地讲它们是:
- name or flags- 选项字符串的名字或者列表,例如foo 或者-f, --foo。
- action - 在命令行遇到该参数时采取的基本动作类型。
- nargs - 应该读取的命令行参数数目。
- const- 某些action和nargs选项要求的常数值。
- default - 如果命令行中没有出现该参数时的默认值。
- type- 命令行参数应该被转换成的类型。
- choices - 参数可允许的值的一个容器。
- required - 该命令行选项是否可以省略(只针对可选参数)。
- help - 参数的简短描述。
- metavar - 参数在帮助信息中的名字。
- dest - 给parse_args()返回的对象要添加的属性名称。
总结
以上就是本文关于Python命令行解析模块详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]