• parse_args(argsparse):python和命令行之间的交互


    初始化

    假设我们创建一个“argp.py”的文件。

    import argparse     # 引入模块
    # 建立解析对象
    parser = argparse.ArgumentParser()
    
    parser.add_argument("echo")         # xx.add_argument("aa")
    # 给xx实例增加一个aa属性
    
    # 把parser中设置的所有"add_argument"给返回到args子类实例当中
    # 那么parser中增加的属性内容都会在args实例中,使用即可。
    args = parser.parse_args()
    parser.parse_args()
    print(arg.echo)     # 打印定位参数echo
    

    运行的话,在python argp.py后面加上abcd(任意);

    其将输出“abcd”。因为我们把abcd赋给了args.echo了。

    给其设置help:
    parser.add_argument("echo", help = "echo is here~")

    在命令行中输入:
    python argp.py -h
    就可以得到相关的帮助信息。

    type

    假设我们写一个文件,在命令行将其编译时,同时输入一个数字,返回一个平方:
    因为parse.add_argument()对于接受的值默认其为str,如果要将之视为int类型,额外加一句“type=int”。

    import argparse
    parser = argparse.ArgumentParser()
    
    parser.add_argument("square", help = "To sqaure the number given", type = int)
    # 在命令行中,该py文件希望用户能给他一个参数,最终将之转化为:args.square
    
    args = parser.parse_arg()
    print(args.square**2)  

    有了type程序也可以自动过滤掉相关的不符合类型的参数输入。

    可选参数

    add_argument前,给属性名之前加上“—”,就能将之变为可选参数。

    import argparse
    parser = argparse.ArgumentParser()
    
    parser.add_argument("--bool",help = "Whether to pirnt sth.")
    # 这里的bool是一个可选参数,返回给args的是 args.bool
    args = parser.parse_args()
    
    if arg.bool:
        print('bool = 1')

    对于简单程序,我们可能只需要两种值TrueorFalse:输入
    python argp.py --bool 1
    得到
    bool = 1
    既然是可选的,如果不指定(就是不使用它)的话,对应的变量会被设置为None。

    对于简单程序,我们可能只需要两种值 TrueorFalse

    我们可以在原有的程序的基础上,在add_argument中多加一个参数:
    action = "store_true"
    这个时候,只要在命令行中加个bool,args.bool就是True了,无需再加上之后的赋值内容,加了反而会报错。
    但是,如果在parser.add_argument(..., required=True,type=int)的话,那么这个参数就是必须的,因为他是required


    参数简写

    parser.add_argument("-b","--bool",action="store_true")
    这样,在程序内部我们依旧使用args.bool,但是在命令行当中我们只需要多写一个“-b”就好了。

    混合定位参数和可选参数

    当我们使用多个parser.add_argument(...)的时候,若将之视为可选参数,无则为None。

    import argparse
    parser = argparse.ArgumentParser()
    
    parser.add_argument("-b","--bool",help="to show the ans in a sentencen form",action = "store_true")
    parser.add_argument("square",type=int)
    
    args = parser.parse_args() 
    
    ans = args.square**2
    
    if args.bool:
        print("the square of {} = {}".format(args.square,ans))
    else:
        print(ans)
    # 得到的效果为:一旦输入“-b”然后再输入相关的参数,就可以得到我们需要的结果了,不输入“-b”我们还是可以得到结果,只不过是另外一种方式而已。
    

      

    限制输入的值:进一步,我们可以进行以下操作,或者对之进行一些了解:

    • parser.add_argument("-b","--bool",choices=[0,1],help="you can only input 0 or 1.")
      其中,choice可以限定我们能够输入的数。
    • 参数值和顺序:
      一般我们要把可选参数最后add,不可选参数放前面add。
      而在命令行里面输入代码时,程序会先赋值“先add的参数选项”。
      比如我先parser.add_argument(“a”,…)再b;
      输入命令行的时候:python xx.py x y,这个时候,args.a=x ; args.b=y。
    • count操作计数赋值:
      parser.add_argument("-b","--bool",action="count",type=int)
      这个时候,在命令后加上 -b ——> bool=1 ; -bb ——> bool=2 ;以此类推。
      但是这样的话,如果在程序里拿bool作为比较对象的时候,比如if bool > 0:,不写“-b”的时候会报错,原因是此时的bool是None,无法比较,要解决这个问题我们只需要加上一个 default 选项:parser.add_argument("-b","--bool",action="count",type=int,default=0)就好了。

    高级用法

    光上面那点知识,怕是根本算不上炫酷。我们肯定需要更牛逼的办法。

    • 一个py文件的文件名字为“__file__”
    • 参数冲突:
      我们可以通过group方法,来让group组的参数不可以被同时指定:
      import argparse
      
      parser = argparse.ArgumentParser()
      
      group = parser.add_mutually_exclusive_group()
      group.add_argument("-f","--form",action="store_true")
      group.add_argument("-F","--Form",action="store_true")
      parser.add_argument("x",type = float)
      parser.add_argument("y",type = float)
      
      args = parser.parse_args()
      ans = args.x**args.y
      
      if args.form:
          print("{} to the power {} equals {}".format(args.x, args.y, ans))
      elif args.Form:
          print("{}^{} = {}".format(args.x,args.y,ans))
      else:
          print(ans)
      

        注意点:帮助信息中若有“[a | b]”就意味着,ab不可以同时使用。

      • 在参数简写的时候不要定义“-h”,这个是给help用的。
      • 如果你设置了几个同类型(比如int)的可选参数,并且给他们简写参数了,比如:
        x -> -x ; y -> -y …
        那么在命令行赋值的时候就应该写:
        ... -x 10 -y 100
        x = 10 ; y = 100 ;
  • 相关阅读:
    一个比喻理解进程和线程的区别
    python蛋疼的编码decode、encode、unicode、str、byte的问题都在这了
    python类中__unicode__和__str__方法的妙用
    python re 正则提取中文
    一个python爬虫协程的写法(gevent模块)
    python 中range和xrange的区别
    python 监控oracle 数据库
    Spring security 知识笔记【自定义登录页面】
    Spring security 知识笔记【内存角色授权】
    Spring security 知识笔记【入门】
  • 原文地址:https://www.cnblogs.com/still-smile/p/11636958.html
Copyright © 2020-2023  润新知