zoukankan      html  css  js  c++  java
  • python argparse小记

    argparse模块是从命令行向程序传参用的,本文参考官网(https://docs.python.org/2/howto/argparse.html
    1.最简单的
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("echo")
    args = parser.parse_args()
    print(args.echo)
    

      运行时程序名加echo的值,如:

    python main.py 5

    2.上面这样的参数来多了运行时记不住啊,怎么办?给起个名字

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--echo")
    args = parser.parse_args()
    print(args.echo)
    

      运行时就能区分啦:python 111.py --echo 5

    3.好记是好记了,但是不好敲啊,这么长,怎么办?起个缩写

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--echo")
    args = parser.parse_args()
    print(args.echo)
    

      这样,每次运行时用缩写就可以了:python 111.py -e 5,当然,现在全称依旧是可以用的

    4.仅用一个单词代表一个变量,当时还好,过一段时间,自己的代码自己都不认识了,所以,备注可不能少了,args模块还提供了一个高级玩法:help

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--echo",help="这是一段备注,防止自己的代码自己不认识")
    args = parser.parse_args()
    print(args.echo)
    

      这样的好处是什么呢?那就是你不用跑到代码行里去找注释了,用的时候直接:python 111.py -h,就会显示

    usage: 111.py [-h] [-e ECHO]
    
    optional arguments:
      -h, --help            show this help message and exit
      -e ECHO, --echo ECHO  这是一段备注,防止自己的代码自己不认识
    

      -h,就是help的缩写,函数自带的参数,注意自己给自定义参数缩写时别冲突了吖。是不是很方便?

    5.有没有爱上args函数呢?但是实际使用还是有点麻烦,所有传入的参数都是str类型的,因为python可以自动判断变量类型,开始这样设计时为了方便我们使用,但是有的时候反而不方便,比如,我要传进去数字5,于是:python 111.py -e 5   (代码没变,与4一样)

    但是打印一下:

    print(type(args.echo))
    
    --------------------------------
    你会发现
    <class 'str'>
    

      这也可以理解,5既可以是数字也可以是str,产生了歧义,python君就自作主张,都变成了str,可我明明要数字,每次传参进来我还要手动转换,这也他不智能了叭。别急,你想到的,大神们也想到了,于是加上了类型选择type=:

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--echo",type=int,help="这是一段备注,防止自己的代码自己不认识")
    args = parser.parse_args()
    print(type(args.echo))
    

      运行一下>python 111.py -e 5,结果:<class 'int'>,果然好用。

    6.但是5中类型定义有一个坑,那就是bool,不管赋值时True还是False,传参进去得到的都是True,这是因为,这个变量在接受到命令行传来的参数以后直接判断是否有值,False倏然表示假,但是他自身也是一个值,于是程序就傻傻的认为有值,于是都是True啦,可是不给他传值,args函数自身的纠错机制会报错,于是~~~。

    解决方法也有很多,有兴趣的小伙伴们可以到网上自己找一下,这里我只介绍一种我自己比较常用的,action="True":

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--echo",action="store_true",help="这是一段备注,防止自己的代码自己不认识")
    args = parser.parse_args()
    # print(type(args.echo))
    print(args.echo)
    

      其他类型都是给个变量名之后必须跟一个值,但是action同学与众不同,只有变量名就管用啦。来试试:

    运行  python 111.py -e  得到结果  True

    运行  python 111.py  得到结果  False

    是不是就完美实现了bool的功能呢?只要思想不滑坡,办法总比困难多。

    7.用好前6条,基本的args就可以用起来了,但是,实际应用中总有粗心的小伙伴,参数会出错。小问题,debug嘛,本来生活就在写bug和改bug中平淡的度过了,直到他小手一抖把嫦娥一百号送到了火星。python君感觉这样不行啊,需要帮忙限制一下,只能从‘月球’,‘地球’中选一个,没有‘火星’选项,于是就有了choices选项:

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--echo",type=int,choices=[0,1],help="这是一段备注,防止自己的代码自己不认识")
    args = parser.parse_args()
    # print(type(args.echo))
    print(args.echo)
    

      这样,你只能从chioces列表中选啦,否则就报错:

    111.py: error: argument -e/--echo: invalid choice: '1' (choose from 0, 1)
    

    8.还有一个比较好玩的操作action=‘count’,从字面就可以理解,就是计数:

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--echo",action="count",help="这是一段备注,防止自己的代码自己不认识")
    args = parser.parse_args()
    print(args.echo)
    -----------------------------------------------------------
    python 111.py -e    
    结果:1
    python 111.py -eee
    结果:3
    

      看懂了吗?就是count你输入了几个e

    9.我运行一段代码,大多数情况下参数都是一样的,每次都要敲,好烦。python君也想到了呢,default,比如:

    parser.add_argument("-v", "--verbosity", action="count", default=0)
    这样,你就给了这个参数默认值0了,以后在输入时可以跳过这个参数了。

     10.最后一个知识点,互斥组,就是传参多个bool型变量,只有一个为真,直接上例子吧:

    import argparse
    
    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-v", "--verbose", action="store_true")
    group.add_argument("-q", "--quiet", action="store_true")
    parser.add_argument("-e", "--echo",action="count",help="这是一段备注,防止自己的代码自己不认识")
    args = parser.parse_args()
    print(args.echo)
    

      如果你两个互斥变量都为真  python 111.py -q -v -e

    就会报错:  111.py: error: argument -v/--verbose: not allowed with argument -q/--quiet

     在if elif选项中来传参很好用哟。

    11.有时,需要向程序中传入一个list,args也是可以实现的(参考https://blog.csdn.net/kinggang2017/article/details/94036386

    parser.add_argument("-g", "--gpu_list", type=int, nargs='+', default=[0, 1, 2, 3],
    

      运行时,python 111.py -g 1 2 3来指定列表值,注意,1 2 3之间用space分割。这样能传入int型列表,其他类型的列表可以参考上面的连接

    这次就分享这么多,有什么遗漏的欢迎大家补充。

  • 相关阅读:
    VS2010+C#写的3D的Android游戏开源咯....不来看别后悔哦。
    把XAML放在服务端,即改即现.....
    TagSL框架设计(1)先来点简介
    OpenMP模式下多线程文件操作 (转)
    VS获取工程版本信息
    OpenMP模式下多线程文件操作(五)
    简单建立DLL和使用DLL
    OpenMP模式下多线程文件操作(三)
    OpenMP模式下多线程文件操作(四)
    【转】VC2008在工具栏Toolbar里添加XP风格spin box control控件
  • 原文地址:https://www.cnblogs.com/jiangnanyanyuchen/p/11991181.html
Copyright © 2011-2022 走看看