optparse - argparse 模块

做一个战士不是一件简单的事。这是一场无休止的、会持续到我们生命最后一刻的斗争。没有人生下来就是战士,就像没人生下来就注定庸碌,是我们让自己变成这样或那样!

前言

optparse模块在2.7版本后将被弃用也不会得到更新,会使用argparse模块来替代。

① optparse 模块

import optparse

def main():
    parser = optparse.OptionParser()
    parser.usage = 'python3 optparse - argparse -h host -p port'
    parser.add_option('-H',dest='tgthost',type='string',help='specify target host') # 注意这里使用 -H 来指明导入主机,因为 -h 是约定俗成的查看帮助作用,
    parser.add_option('-p',dest='tgtport',type='int',help='specify target port')
    (options,args) = parser.parse_args()

    if options.tgthost == None or options.tgtport == None:
        print(parser.usage)
        exit(0)
    else:
        tgthost = options.tgthost
        tgtport = options.tgtport
        print('主机是:' + tgthost)
        print('端口是:' + str(tgtport))

if __name__ == '__main__':
    main()

结果

~$> python optparse模块使用.py -H zhutou.com -p 21 22
主机是:zhutou.com
端口是:21

不过以上的程序有个缺点,就是不能接收多个参数,比如不能接收多个主机或多个端口,于是使用 append() 方法来扩容。

修改之后的程序

import optparse

def main():
    parser = optparse.OptionParser()
    parser.usage = 'python3 optparse - argparse -h host -p port'
    parser.add_option('-H',dest='tgthost',type='string',help='specify target host') # 注意这里使用 -H 来指明导入主机,因为 -h 是约定俗成的查看帮助作用,
    parser.add_option('-p',dest='tgtport',type='int',help='specify target port')
    (options,args) = parser.parse_args()

    tgthost = options.tgthost
    tgtport = options.tgtport
    args.append(tgtport)
    if tgthost == None or tgtport == None:
        print(parser.usage)
        exit(0)
    else:
        print('主机是:' + tgthost)
        print('端口是:' ,end='')
        for port in args:
            print(str(port) + ' ',end='')

if __name__ == '__main__':
    main()

结果

~$> python optparse模块使用.py -H zhutou.com -p 22 21 25 443 445 3306
主机是:zhutou.com
端口是:21 25 443 445 3306 22

② argparse 模块

argparse 模块使得创建一个用户友好的命令行接口更加容易,程序定义了它需要的参数,同时 argparse 模块将知道如何解析 sys.argv 之外的参数。argparse 模块还会自动地生成 helpusage 信息,并在用户输入不合理的参数之后会发出错误。
PS: 关于 argparse 模块的详细信息可以参考 Python文档
以下内容参考

1. 基本框架

import argparse

def main():
    parse = argparse.ArgumentParser(description='demo of argparse')
    parse.add_argument('-n','--name',dest='name',help='special name is need')
    parse.add_argument('-y','--year',dest='year',help='special year is need')

    args = parse.parse_args()
    if args.name == None or args.year == None:
        print(parse.usage)
        exit(0)
    else:
        name = args.name
        year = args.year
        print('Hello {} {}'.format(name,year))

if __name__ == '__main__':
    main()

结果

~$> python .\argparse模块使用.py -h
usage: argparse模块使用.py [-h] [-n NAME] [-y YEAR]

demo of argparse

optional arguments:
  -h, --help            show this help message and exit
  -n NAME, --name NAME  special name is need
  -y YEAR, --year YEAR  special year is need
~$> python .\argparse模块使用.py -n lin -y 2020
Hello lin 2020

2. default

default 表示命令行没有设置该参数的时候,程序默认使用 default 指定的值代替。

parser.add_argument('-n',default='zhutou')

3. require

如果设置了 require=True,则在实际运行的时候不设置该参数将报错。

parser.add_argument('-n',require=True)

4. type

默认的参数类型是 str 类型,可以设置成整型/布尔型:type=inttype=bool

parser.add_argument('-n',type=int)
parser.add_argument('-n',type=bool)

5. choices

参数值只能从几个选项里面选择

parser.add_argument('-n',choices=['zhutou1','zhutou2','zhutou3'])

6. help

指定参数说明的信息

7. dest

设置参数在代码中的变量名,如果通过 dest=xxx 设置了参数的变量名,那么在代码中使用 args.xxx 来获取参数值。

8. nargs

设置了参数可以接收多少个参数

parser.add_argument('-n',nargs=x)
含义
N 参数的绝对个数(例如:3)
‘?’ 0或1个参数
‘*’ 0或所有参数
‘+’ 所有,并且至少一个参数
                                                                                                                                               猪头
                                                                                                                                            2020.4.8
发布了51 篇原创文章 · 获赞 4 · 访问量 2739

猜你喜欢

转载自blog.csdn.net/LZHPIG/article/details/105382035