设为首页 收藏本站
查看: 803|回复: 0

[经验分享] ZMAN的学习笔记之Python篇:命令行解析

[复制链接]

尚未签到

发表于 2015-11-29 09:01:40 | 显示全部楼层 |阅读模式
  
  ZMAN的学习笔记之Python篇:
    1.装饰器
    2.函数“可变长参数”
    3.命令行解析
  
  
  注:本文全原创,作者:ZMAN  (http://www.cnblogs.com/zmanone/)
  
  在Python中,对命令行的解析方式不唯一,本文将介绍两种方法:一种是用sys.argv手动设置,另一种是用argparse模块。
  
  一、sys.argv是什么
    首先看一个例子:



import sys
print(len(sys.argv))
for arg in sys.argv:
print(arg)
    将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:



python argparse1.py arg1 arg2 arg3
    回车后,运行结果为:



4
argparse1.py
arg1
arg2
arg3
    sys.argv是一个list,保存命令行参数,其中第一个值是“该程序所在路径”,我们可以观察到:在cmd中输入的参数被依次传入这个列表中(以空格作为间隔)。
  
  二、使用sys.argv解析命令行
    大致了解了sys.argv,我们可以手动写命令行解析功能。代码如下:



import sys
if sys.argv[1].startswith('--'):
arg = sys.argv[1][2:]
if arg == 'help':
print("这里打印帮助信息")
elif arg == 'sum':
count = 0
if len(sys.argv) < 3:
print("想要使用sum功能,请输入一些数字")
sys.exit()
for i in sys.argv[2:]:
try:
count += int(i)
except ValueError as e:
print("输入的参数不正确")
sys.exit()
print(count)
  
    将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:



python argparse1.py --help
    回车后,输出一行字:这里打印帮助信息
    继续输入:



python argparse1.py --sum 1 3 5 4
    回车后,输出:13
  
    试试看输入异常值:



python argparse1.py --sum 1 3 5 a
    回车后,输出一行字:输入的参数不正确
  
    继续输入:



python argparse1.py --sum
    回车后,输出一行字:想要使用sum功能,请输入一些数字
  
    上述代码可以捕捉 "--help"和"--sum"两个命令,如果用户传入"help",程序会打印一些帮助信息,如果用户传入"--sum",则会将之后的参数做累加计算并输出结果,也能处理一些异常情况。
    下面介绍使用argparse模块来解析命令行参数。
  
  三、argparse模块
    Python2.7版本开始自带argparse模块,这是一个用来解析命令行参数的模块,可以自动生成帮助信息。
    首先,我们来看一下最简单的使用:



import argparse
myParser = argparse.ArgumentParser(description='解析命令行演示')
myParser.parse_args()
    将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:



python argparse1.py --help
    回车后,输出:



usage: argparse1.py [-h]
解析命令行演示
optional arguments:
-h, --help  show this help message and exit
  我们可以看到,使用argparse模块,会自动包含--help信息。
  
  四、argparse定制解析
    接着,我们可以使用add_argument方法来增加参数。先来看一个简单的实例:



import argparse
import math
myParser = argparse.ArgumentParser()
# 默认接收的参数都是str类型,因此这里要限定一下参数类型
myParser.add_argument('-f', '--factorial', type=int, help="给出一个正整数,可以求出该数的阶乘")
myParser.add_argument('-a', '--accumulate', type=float, help="计算若干个浮点数的累加值", nargs='*')
args = myParser.parse_args()
if args.factorial:
print(math.factorial(args.factorial))
if args.accumulate:
print(sum(i for i in args.accumulate))
  
    将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:



python argparse1.py -f 4
    回车后,输出:24
  
    继续输入:



python argparse1.py -a 1.2 3.2 0.2
    输出:4.7
  
    以上的代码定义了两个参数,factorial可以求阶乘,accumulate是累加计算。增加参数解析的方法如下:
    ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
    介绍其中几个参数:
    name or flags - 定义参数的名字
    action - 定义了一些基本的处理方式:
        'store' - 默认值就是这个,保存命令行参数
        'store_const' - 设立并保存一个静态值:parser.add_argument('--example', action='store_const', const=2)
        'store_true' 和 'store_false' - 设立并保存一个布尔值。
        'append' - 将同一个参数的值加入列表中
        'append_const' - 设立并保存静态值到列表中
        'count' - 计算关键词出现的次数
        'help' - 打印帮助信息,默认值也有这个
        'version' - 版本号:parser.add_argument('--example', action='version', version='1.0')
    nargs - 定义接收参数值的数量:
        N - 任意一个整数,以列表形式保存
        '*' - 接收任意数量的参数值,以列表形式保存
        '+' - 和'*'一样可以接收任意数量的参数值,并且,如果没有参数值,会抛出error
        'argparse.REMAINDER' - 所有剩余的参数值都会被放到一个list中
    type - 定义参数值的类型,默认参数值类型是string,也可以利用type来调用一个函数,将接收到的参数值传给一个自定义函数!
    choices - 定义一个列表来限定用户传入的参数值。
        如:praser.add_argument('--example', type=int, choices=range(1,5)),这样用户只能传入1,2,3,4这几个数字,不然会抛出参数值不合法的error。
    required - 限定某个参数是不是必填项,值为True或False
    help - 参数的帮助信息~

    dest - 接收到的参数值赋给某个变量。
        如:praser.add_argument('--example', type=int),传入2,则example=2;若改为:praser.add_argument('--example', type=int, dest='myValue'),传入2,则myValue=2。
  
  四、设定“互斥”参数
    上面那段示例代码中的两个参数,我们可以同时操作,就像这样:python argparse1.py -a 1.2 3.2 0.3 -f 4,但是有时候,几个参数我们想只让用户选其中一个进行操作,这时候就要用到“互斥”功能了~将代码修改成如下:



import argparse
import math
myParser = argparse.ArgumentParser()
# 互斥方法
group = myParser.add_mutually_exclusive_group()
group.add_argument('-f', '--factorial', type=int, help="给出一个正整数,可以求出该数的阶乘")
group.add_argument('-a', '--accumulate', type=float, help="计算若干个浮点数的累加值", nargs='*')
args = myParser.parse_args()
if args.factorial:
print(math.factorial(args.factorial))
if args.accumulate:
print(sum(i for i in args.accumulate))
    如果这时候,我们再一起传值,输入:python argparse1.py -a 1.2 3.2 0.3 -f 4,就会抛出错误:



usage: argparse1.py [-h] [-f FACTORIAL | -a [ACCUMULATE [ACCUMULATE ...]]]
argparse1.py: error: argument -f/--factorial: not allowed with argument -a/--accumulate
  
  五、小结
    本文介绍了两种Python解析命令行的方法,相比之下,使用argparse模块,确实更方便一些。当然啦,argparse模块的内容可不止这一点哦,如果大家有兴趣的话,可以自己去看这个模块的官方文档~~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144784-1-1.html 上篇帖子: Python学习 —— 阶段综合练习二 下篇帖子: python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表