python命令行标准解析库:argparse

官方Tutorial: https://docs.python.org/3/howto/argparse.html#id1

中文参考:https://www.cnblogs.com/dengtou/p/8413609.html

argparsethe recommended command-line parsing module in the Python standard library.

  • 1、定义:argparse是python标准库里面用来处理命令行参数的库
  • 2、命令行参数分为位置参数(Positional arguments可选参数(Optional arguments

        位置参数就是程序根据该参数出现的位置来确定的

[root@localhost] ls root/    #其中root/是位置参数

     可选参数是应用程序已经提前定义好的参数,不是随意指定的,一般会加上 - 或者 --

[root@localhost] ls -l    # -l 就是ls命令里的一个选项参数
  •  3、使用步骤:(1)import argparse    首先导入模块

                        (2)parser = argparse.ArgumentParser()    创建一个解析对象

                        (3)parser.add_argument()    向该对象中添加你要关注的命令行参数和选项

                        (4)parser.parse_args()    进行解析

 

  • 4、 使用位置参数(Positional arguments)

先说结论,Positional arguments是必须传入的,否则报错

opt.py编辑: 

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

命令行运行:

[baiyu] python opts.py 
usage: opts.py [-h] echo
opts.py: error: the following arguments are required: echo  
''' 缺失所需参数echo, Positional arguments是必须传入的 '''

[baiyu] python opts.py --help
usage: opts.py [-h] echo

positional arguments:  ''' 位置参数 '''
  echo

optional arguments:    ''' 可选参数,可以看到,使用argparse后,会自动生成--help '''
  -h, --help  show this help message and exit

[baiyu] python opts.py foo
foo

上面的结果看起来已经可以了,使用--help以后,显示出了位置和选项参数,但是我们并不知道到echo是干什么用的,所以为了更加细致的操作,我们可以这样做:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('echo', help='"echo the string you use here"')
args = parser.parse_args()
print(args.echo)

命令行运行:

[baiyu] python opts.py -h
usage: opts.py [-h] echo

positional arguments:
  echo        "echo the string you use here"

optional arguments:
  -h, --help  show this help message and exit

还可以进行其他操作:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
                    type = int)  # 这里需要指定type,默认是str,否则报错
args = parser.parse_args()
print(args.square**2)

命令行运行:

[baiyu] python opts.py 4
16

 

  • 5、使用可选参数(Optional  arguments)

先说结论:

可选参数非必须传入,不传入该参数,执行程序完全没有问题(一般会设置一个默认值或为None)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")
[baiyu] python opts.py  ''' 可不选Optional arguments '''

[baiyu] python opts.py --verbosity
usage: opts.py [-h] [--verbosity VERBOSITY]
opts.py: error: argument --verbosity: expected one argument
''' 需指定参数值 '''

[baiyu] python opts.py --verbosity 1
verbosity turned on

[baiyu] python opts.py -h
usage: opts.py [-h] [--verbosity VERBOSITY]

optional arguments:
  -h, --help            show this help message and exit
  --verbosity VERBOSITY
                        increase output verbosity

从上面的程序看到,使用--verbosity参数时,需在后面指定参数值,这里由于没有限制,所以可以是任何值,在不指定的时候实际上默认为None,所以可以用if语句进行判断操作。

但这样并不好,应为你的参数总是瞎传,实际上有更好的方式去设置,比如可以设置参数类型,还有其他操作,我们举一个设置标志的方法:

mport argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
''' 可以看到这里,有action="store_true", 这样的话,使用--verbose,则为True, 不使用则为False,不用传其他值进去 '''
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
[baiyu] python opts.py                 # 不传为 False

[baiyu] python opts.py --verbose       # 传为 True
verbosity turned on

[baiyu] python opts.py --verbose 1
usage: opts.py [-h] [--verbose]
opts.py: error: unrecognized arguments: 1

[baiyu] python opts.py -h
usage: opts.py [-h] [--verbose]

optional arguments:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity

 还可以指定参数类型,指定参数值:

parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
  • 6、Short options

实际上我们一般用的可选参数都没有上面那么长,都是使用简化后的参数,这个操作也很简单:

parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
[baiyu] python opts.py -h
usage: opts.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity
  • 7、Combining Positional and Optional arguments 联合使用两种参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('squire', type=int,
                    help='display a squire of a given number')
parser.add_argument('-v', "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
answer = args.squire ** 2
if args.verbose:
    print("the squire of {} equals {}".format(args.squire, answer))
else:
    print(answer)
[baiyu] python opts.py    ''' Positional arg必须传入 '''
usage: opts.py [-h] [-v] squire
opts.py: error: the following arguments are required: squire

[baiyu] python opts.py 4  ''' Optional arg可选 '''
16

[baiyu] python opts.py -v 4 
the squire of 4 equals 16

[baiyu] python opts.py 4 -v   ''' 两者顺序无所谓 '''
the squire of 4 equals 16

[baiyu] python opts.py -h
usage: opts.py [-h] [-v] squire

positional arguments:
  squire         display a squire of a given number

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity
  • 8、其他一些操作
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
[baiyu] python opts.py 4
16
[baiyu] python opts.py 4 -v
4^2 == 16
[baiyu] python opts.py 4 -vv
the square of 4 equals 16
[baiyu] python opts.py 4 -vvv
the square of 4 equals 16

 其他去看官网吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章