翼度科技»论坛 编程开发 python 查看内容

python中argparse模块的用法

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
argparse 模块

一个可执行文件或者脚本都可以接收参数。
  1. $ ls -l /etc
  2. /etc 是位置参数
  3. -l 是短选项
复制代码
如何把这些参数传递给程序呢?
从3.2开始Python提供了功能强大的参数分析的模块argparse。
1.参数分类

参数分为:

  • 位置参数,参数放在那里,就要对应一个参数位置。例如/etc就是对应一个参数位置。
  • 选项参数,必须通过前面是 - 的短选项或者 -- 的长选项,然后后面的才算该选项的参数,当然选项后面也可以没有参数。
上例中,/etc对应的是位置参数,-l是选项参数。
  1. ls -alh src
复制代码
2.基本解析

先来一段最简单的程序
  1. import argparse
  2. parser = argparse.ArgumentParser() # 获得一个参数解析器
  3. args = parser.parse_args()  # 分析参数
  4. parser.print_help()  # 打印帮助
复制代码
运行结果
  1. $ python test.py -h
  2. usage: test1.py [-h]
  3.    
  4. optional arguments:
  5. -h, --help show this help message and exit
复制代码
argparse不仅仅做了参数的定义和解析,还自动帮助生成了帮助信息。尤其是usage,可以看到现在定义的参数是否是自己想要的。
3.解析器的参数

参数名称说明prog程序的名字,缺省使用 sys.argv[0] 的 basenameadd_help自动为解析器增加 -h 和 --help 选项,默认为Truedescription为程序功能添加描述

  • parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
  1. $ python test.py --help
  2. usage: ls [-h]
  3. list directory contents
  4. optional arguments:
  5.   -h, --help show this help message and exit
复制代码
4.位置参数解析

ls 基本功能应该解决目录内容的打印。
打印的时候应该指定目录路径,需要位置参数。
  1. import argparse
  2. # 获得一个参数解析器
  3. parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list
  4. directory contents')
  5. parser.add_argument('path')
  6.                                  
  7. args = parser.parse_args()  # 分析参数
  8. parser.print_help()  # 打印帮助
  9.                                  
  10. # 运行结果,出现了错误,提示需要输入path对应的位置参数
  11. usage: ls [-h] path
  12. ls: error: the following arguments are required: path
复制代码
程序定义为:
  1. ls [-h] path
  2. -h为帮助选项,可有可无
  3. path为位置参数,必须提供
复制代码
传参
  1. parse_args(args=None, namespace=None)
复制代码
args 参数列表,一个可迭代对象。内部会把可迭代对象转换成list。如果为None则使用命令行传入参数,非None则使用args参数的可迭代对象。
  1. import argparse
  2. # 获得一个参数解析器
  3. parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list
  4. directory contents')
  5. parser.add_argument('path') # 位置参数
  6. args = parser.parse_args(('/etc',))  # 分析参数,同时传入可迭代的参数
  7. print(args, args.path) # 打印名词空间中收集的参数
  8. parser.print_help()  # 打印帮助
复制代码
运行结果
  1. Namespace(path='/etc') /etc
  2. usage: ls [-h] path
  3.                                  
  4. list directory contents
  5.                                  
  6. positional arguments:
  7.   path
  8.                                  
  9. optional arguments:
  10.   -h, --help  show this help message and exit
复制代码
Namespace(path='/etc')里面的path参数存储在了一个Namespace对象内的属性上,可以通过
Namespace对象属性来访问,例如args.path
非必须位置参数
上面的代码必须输入位置参数,否则会报错。
  1. usage: ls [-h] path
  2. ls: error: the following arguments are required: path
复制代码
但有时候,ls命令不输入任何路径的话就表示列出当前目录的文件列表。
  1. import argparse
  2. # 获得一个参数解析器
  3. parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list
  4. directory contents')
  5. parser.add_argument('path', nargs='?', default='.', help="path help") # 位置
  6. 参数,可有可无,缺省值,帮助
  7. args = parser.parse_args()  # 分析参数,同时传入可迭代的参数
  8. print(args) # 打印名词空间中收集的参数
  9. parser.print_help()  # 打印帮助
  10. # 运行结果
  11. Namespace(path='.')
  12. usage: ls [-h] [path]
  13. list directory contents
  14. positional arguments:
  15.   path        path help
  16. optional arguments:
  17.   -h, --help  show this help message and exit
复制代码
可以看出path也变成可选的位置参数,没有提供就使用默认值 .点号 表示当前路径。
help 表示帮助文档中这个参数的描述
nargs 表示这个参数接收结果参数

  • ? 表示可有可无
  • +表示至少一个
  • *可以任意个
  • 数字表示必须是指定数目个
default 表示如果不提供该参数,就使用这个值。一般和?、*配合,因为它们都可以不提供位置参数,不提供就用缺省值
5.选项参数

-l的实现
  1. parser.add_argument('-l') 就增加了选项参数,参数定义为
  2. ls [-h][-l L] [path]
复制代码
和我们要的形式有一点出入,我们期望的是 [-l] ,怎么解决?
nargs能够解决吗?
  1. parser.add_argument('-l', nargs='?')
  2. ls [-h][-l [L]] [path]
复制代码
-l还不是可选参数。
那么,直接把nargs=0,意思就是让这个选项接收0个参数,如下
  1. parser.add_argument('-l', nargs=0)
复制代码
结果,抛出异常
  1. raise ValueError('nargs for store actions must be > 0; if you '
  2. ValueError: nargs for store actions must be > 0; if you have nothing to store, actions such as
  3. store true or store const may be more appropriate
复制代码
看来nargs是控制位置参数和选项参数的,不能影响选项参数的参数。
为了这个问题,使用action参数
  1. parser.add_argument('-l', action='store_true')
复制代码
看到命令定义变成了 ls [-h][-l] [path]
提供-l选项,例如

  • ls -l 得到Namespace(l=True, path='.'),提供-l值是True
  • ls 得到Namespace(l=False, path='.'),未提供-l值是False
这样同True、False来判断用户是否提供了该选项
  1. parser.add_argument('-l', action='store_const', const = 20)
  2. # 提供-l选项,属性值为20;否则,对应值为None
复制代码
-a的实现
  1. parser.add_argument('-a', '--all', action='store_true') # 长短选项同时给
复制代码
6.属性名称

参数都是Namespace对象的属性,如果想指定这些属性名,可以使用dest。
  1. parser.add_argument('-l', action='store_true', dest='longfmt')
复制代码
7.示例
  1. import argparse
  2. # 获得一个参数解析器
  3. parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
  4. # 位置参数,可有可无,缺省值,帮助
  5. parser.add_argument('path', nargs='?', default='.', help='directory')
  6. parser.add_argument('-l', action='store_true', dest='longfmt', help='use along listing format')
  7. parser.add_argument('-a', '--add', action='store_true', help='show all file,do not ignore entrues starting with .')
  8. # 分析参数,同时传入可迭代的参数
  9. args = parser.parse_args()
  10. # 打印名称空间中收集的参数
  11. print(args)
  12. # 打印帮助
  13. parser.print_help()
  14. # Python学习交流QQ群:153708845
  15. # 输出
  16. Namespace(path='.', longfmt=False, add=False)
  17. usage: ls [-h] [-l] [-a] [path]
  18. list directory contents
  19. positional arguments:
  20.   path        directory
  21. options:
  22.   -h, --help  show this help message and exit
  23.   -l          use along listing format
  24.   -a, --add   show all file,do not ignore entrues starting with .
复制代码
8.练习

实现ls命令功能,实现-l、-a和--all、-h选项
实现显示路径下的文件列表
-a和-all 显示包含.开头的文件
-l 详细列表显示
-h 和-l配合,人性化显示文件大小,例如1K、1G、1T等,可以认为1G=1000M
类型字符

  • c 字符
  • d 目录
  • 普通文件
  • l 软链接
  • b 块设备
  • s socket文件
  • p pipe文件,即FIFO
  1. 参看Linux、Unix命令ls -lah
  2. -rw-rw-r--   1     python python     5     Oct 25 00:07       test4
  3. mode       硬链接 属主   属组       字节   时间               文件名
  4. 按照文件名排序输出,可以和ls的顺序不一样,但要求文件名排序
  5. 要求详细列表显示时,时间可以按照“年-月-日 时:分:秒” 格式显示,例如2015-06-17 17:05:00
复制代码
来源:https://www.cnblogs.com/djdjdj123/p/17046984.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具