命令行解析——argparse模块

一、为什么要使用argparse模块?

  为了提升效率,加上提高代码的可复用性,大型的任务中,我们一般不会直接把参数硬编码在程序中,而是通过命令行传入相应的参数,这样的方式更加灵活,且效率更高;甚至,我们都不会从命令行去传入参数,而是通过sh文件,shell脚本编程来传入相应的参数。
  之前还有个optparse,但是Python2.7之后不再对optparse模块进行扩展。
  另外sys模块也可以进行简单的解析。如图,sys.argv[0]代表文件名,sys.argv[n]代表参数n,本质是命令行传入的参数以列表的形式保存在sys.argv这个变量中。在参数很多,有些不需要传入,有些取固定值,有些有数据类型要求,有些参数要传递多个等情况下sys.argv便无法胜任。

二、使用argparse模块主要有哪些步骤?

1 导入模块——argparse

import argparse

2 创建解析器——ArgumentParser

  argparse模块是一个类,因此首先要建立一个对象(ArgumentParser)

parser = argparse.ArgumentParser()    # 实例化

3 添加参数选项——add_argument

parser.add_argument('name')    # 添加位置参数,必须给定
parser.add_argument('-a',  '--age', type=int, dest='age')    # 添加可选参数,可选给定

4 程序调用参数——parse_args

args = parser.parse_args()    # 返回一个命名空间,方便使用变量
args_all = args.__dict__    # 取出所有参数,字典(key,val)
args_name = args.name   # 取出name参数,val

5 如何使用?

(1) 脚本式
vim argparse_test.py
___________________________________________________________
import argparse

def argparse_test():
    parser = argparse.ArgumentParser()     

    parser.add_argument('name',type=str)
    parser.add_argument('-a',  '--age', type=int, dest='age') 

    args = parser.parse_args() 

    print('单个调用参数')
    print(args.name)
    print(args.age)

    print('一次调用全部参数')
    args_all = args.__dict__
    for key,value in args_all.iteritems():
        print ('%s = %s'%(key,value))

if __name__ == '__main__':
    argparse_test()
___________________________________________________________
python3 argparse_test.py tianyu -a 22    # 常用
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
单个调用参数
tianyu
22
一次调用全部参数
name = tianyu
age = 22
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(2) 交互式
import argparse

parser = argparse.ArgumentParser()     

parser.add_argument('name')
parser.add_argument('-a',  '--age', type=int, dest='age') 

args = parser.parse_args('tianyu -a 22'.split())     # 测试时才用
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 Namespace(age=22, name='tianyu')
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

三、ArgumentParser解析器详解

argparse.ArgumentParser(
    prog=None,     # 程序名,默认使用文件名,可以自定义,程序中可以通过%(prog)s引用程序名
    usage=None,     # 用法信息,默认自动生成,也可以自定义
    description=None,    # help信息前显示的信息
    epilog=None,     # help信息之后显示的信息
    parents=[],    # 由ArgumentParser对象组成的列表,它们的arguments选项会被包含到新ArgumentParser对象中
    formatter_class=argparse.HelpFormatter,    # help信息输出的格式,为了美观,详见“参考3”
    prefix_chars='-',    # 参数前缀,默认为’-‘(最好不要修改)        
    fromfile_prefix_chars=None,    # 前缀字符,放在文件名之前,文件内是参数,参数多时使用
    argument_default=None,    # 设置一个全局的选项的缺省值,一般每个选项单独设置,基本没用
    conflict_handler='error',    # 解决冲突的策略,默认情况下冲突会发生错误(最好不要修改)
    add_help=True)    # 是否增加-h/-help选项 (默认为True),一般help信息都是必须的

四、add_argument添加参数选项详解

ArgumentParser.add_argument(
    name or flags...    # 指定位置参数,如 'name' ;或指定可选参数,如 '-n','--name'
    [, action]    # 指定如何处理命令行给出的参数,如 'store'-仅保存参数值,默认;'store_const'-仅保存const关键字指定的值,而不能自己指定参数值;'store_true'和'store_false'-仅保存True和False,而不能自己指定参数值;'append'-将相同参数的不同值保存在一个list中;'count'-统计该参数出现的次数;'version'-输出程序版本信息,('--version', action='version', version='%(prog)s 2.0')
    [, nargs]    # 指定参数的数量,如整数 'n' - n个参数保存在一个list中;'*' -任意多个保存在一个list中;'+' -一个及其以上保存在一个list中;'?' -一次从命令行、const和default中取值,直至取到值;'argparse.REMAINDER' -命令行其余参数保存到一个list中
    [, const]    # 保存一个常量
    [, default]    # 设置参数缺省时的默认值,
    [, type]    # 指定参数类型,默认为str,也可以设置为int和float
    [, choices]    # 设置参数值范围,如果choices中的类型不是字符串,记得指定type,('x', type=int, choices=range(1, 4))
    [, required]    # 指定该选项是否必选,默认为可选(即False)
    [, help]    # 描述选项的作用
    [, metavar]    # 帮助信息中显示的参数名(用来提示)
    [, dest])    # 保存参数的变量名,可自定义),默认从选项中提取

参考

1 Python解析命令行参数,你到底会不会用argparse?
2 33 Python 详解命令解析 - argparse
3 python命令行解析模块argparse
4 argparse — Parser for command-line options, arguments and sub-commands

发布了11 篇原创文章 · 获赞 4 · 访问量 1961

猜你喜欢

转载自blog.csdn.net/ChenTianyu666/article/details/101024144
今日推荐