前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python argparse处理命令行参数

python argparse处理命令行参数

作者头像
生信修炼手册
发布2020-05-25 15:44:48
1.5K0
发布2020-05-25 15:44:48
举报
文章被收录于专栏:生信修炼手册生信修炼手册

欢迎关注”生信修炼手册”!

对于脚本编程而言,经常需要从命令行传递参数到脚本中。对于命令行参数的定义和使用,有一套完整的规则,以linux上的ls命令为例

代码语言:javascript
复制
ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -l                         use a long listing format
  -t                         sort by modification time, newest first

上述命令通过help选项来查看ls命令的帮助文档,输出的内容很多,这里我只截取了部分。从输出的内容可以看到,命令行参数可以分为两大类

  1. 可选参数
  2. 位置参数

option表示可选参数,有两种写法,一种是一个短横杠后面加选项名称,称之为短选项,另外一种是两个短横杠后面加选项名称,称之长选项。位置参数是必须提供的,前面不需要短横杠的修饰,直接就是参数名称,ls命令的用法示意如下

代码语言:javascript
复制
ls -l dir

其中-l就是一个选项, dir则是一个位置参数, 要在python脚本中实现这样的命令行传参,可以借助内置模块argparse来实现,基本用法示意如下

代码语言:javascript
复制
import subprocess
import argparse
import shlex
# 定义一个命令行参数解析器
parser = argparse.ArgumentParser()
# 添加选项
parser.add_argument('-l', '--long', dest = 'long', action = 'store_true', help = 'use long list format')
# 添加位置参数
parser.add_argument('dir',  help = 'direatory name')
# 捕获选项和参数
args = parser.parse_args()
#通过属性访问各个参数
cmd = 'ls {}'.format(args.dir)

if args.long:
    cmd = 'ls -l {}'.format(args.dir)

print(shlex.split(cmd))
subprocess.run(shlex.split(cmd))

在命令行运行该脚本

代码语言:javascript
复制
python test.py
usage: test.py [-h] [-l] dir
test.py: error: the following arguments are required: dir

可以看到,argparse为脚本自动添加了-h选项,用来查看帮助文档

代码语言:javascript
复制
python test.py -h
usage: test.py [-h] [-l] dir

positional arguments:
  dir         direatory name

optional arguments:
  -h, --help  show this help message and exit
  -l, --long  use long list format

argparse会格式化输出帮助信息。在该模块中,关键的是掌握add_argument方法的使用,该方法有多个参数,列表如下

1. name

表示参数的名称,选项可以同时提供短选项和长选项,也可以只提供其中的一种,位置参数直接写参数名称即可, 用法如下

代码语言:javascript
复制
# 指定一个短选项
>>> parser.add_argument('-l')
_StoreAction(option_strings=['-l'], dest='l', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
# 指定一个常选项
>>> parser.add_argument('--long')
_StoreAction(option_strings=['--long'], dest='long', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
# 同时指定长选项和短选项
>>> parser.add_argument('-p','--threads' )
_StoreAction(option_strings=['-p', '--threads'], dest='threads', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
# 指定位置参数
>>> parser.add_argument('name' )
_StoreAction(option_strings=[], dest='name', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

2. type

命令行传递的参数默认用字符串存储,如果要转换成其他数据类型等,比如整数,浮点数等,可以通过指定type的值来实现,用法如下

代码语言:javascript
复制
# type = int, 转换为整型
>>> parser.add_argument('-t','--cpus', type = int)
_StoreAction(option_strings=['-t', '--cpus'], dest='cpus', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
# type = float, 转换为浮点型
>>> parser.add_argument('-c','--cutoff', type = float)
_StoreAction(option_strings=['-c', '--cutoff'], dest='cutoff', nargs=None, const=None, default=None, type=<class 'float'>, choices=None, help=None, metavar=None)
#  支持直接读写文件
>>> parser.add_argument('file', type = argparse.FileType('r'))
_StoreAction(option_strings=[], dest='file', nargs=None, const=None, default=None, type=FileType('r'), choices=None, help=None, metavar=None)

3. default

参数的默认值, 用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t','--threads', type = int, default = 10)
_StoreAction(option_strings=['-t', '--threads'], dest='threads', nargs=None, const=None, default=10, type=<class 'int'>, choices=None, help=None, metavar=None)

4.required

通过指定required=True, 可以将可选参数变为必须参数,用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t','--threads', type = int, default = 10, required = True)
_StoreAction(option_strings=['-t', '--threads'], dest='threads', nargs=None, const=None, default=10, type=<class 'int'>, choices=None, help=None, metavar=None)

5. help

指定参数的帮助信息,当运行-h时,help的值会显示在屏幕上, 用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t','--threads', type = int, default = 10, help = 'cpu numbers')
_StoreAction(option_strings=['-t', '--threads'], dest='threads', nargs=None, const=None, default=10, type=<class 'int'>, choices=None, help='cpu numbers', metavar=None)

6. dest

参数的名称,默认通过name参数的值来访问参数,当指定了dest参数时,则用dest的值来访问对应的参数,用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t','--threads', dest = 'cpus', type = int, default = 10)
_StoreAction(option_strings=['-t', '--threads'], dest='cpus', nargs=None, const=None, default=10, type=<class 'int'>, choices=None, help=None, metavar=None)

7. metavar

参数的别名,当运行-h来查看脚本的帮助信息时,默认使用name或者dest的值,如果指定了metavar,则参数名称显示为metavar的值, 该参数仅在显示帮助信息时有用,没有其他实际含义,用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t', dest = 'cpus', metavar = 'threads', type = int, default = 10)
_StoreAction(option_strings=['-t'], dest='cpus', nargs=None, const=None, default=10, type=<class 'int'>, choices=None, help=None, metavar='threads')

8. choices

其值为一个列表,指定了参数的可选范围,如果提供的值超出范围,程序会报错, 用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t','--threads', choices = range(21), type = int, default = 10)
_StoreAction(option_strings=['-t', '--threads'], dest='threads', nargs=None, const=None, default=10, type=<class 'int'>, choices=range(0, 21), help=None, metavar=None)

9. action

指定参数的行为,默认值为store, 只存储对应的值,还有其他的可选值,用法如下

代码语言:javascript
复制
# 默认action = store
>>> parser.add_argument('name' )
_StoreAction(option_strings=[], dest='name', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
# 指定该参数时,其值为True
>>> parser.add_argument('--quiet', action = 'store_true')
_StoreTrueAction(option_strings=['--quiet'], dest='quiet', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
# 指定该参数时,其值为False
>>> parser.add_argument('--log', action = 'store_false')
_StoreFalseAction(option_strings=['--log'], dest='log', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None)
# 参数的值为const对应的值
>>> parser.add_argument('chrs', action = 'store_const', const = 'chr1')
_StoreConstAction(option_strings=[], dest='chrs', nargs=0, const='chr1', default=None, type=None, choices=None, help=None, metavar=None)
# 参数的值为一个列表
>>> parser.add_argument('chrs', action = 'append')
_AppendAction(option_strings=[], dest='chrs', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
# 参数的值为一个列表
>>> parser.add_argument('chrs', action = 'extend')
_ExtendAction(option_strings=[], dest='chrs', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

10. const

当action = store_const或者append_const时发挥作用,将参数的值设置为const参数对应的常数,用于固定参数的值,用法如下

代码语言:javascript
复制
>>> parser.add_argument('-t','--threads', action = 'store_const', const = 10)
_StoreConstAction(option_strings=['-t', '--threads'], dest='threads', nargs=0, const=10, default=None, type=None, choices=None, help=None, metavar=None)

11. nargs

定义参数值的个数,默认参数都是一个值,指定该参数,则参数的值用列表存储,比如nargs=1, 此时参数为长度为1 的列表,用法如下

代码语言:javascript
复制
# 指定一个具体的数值,对参数的个数进行限定
# 提供的参数个数不对,会报错
>>> parser.add_argument('names', nargs = 2)
_StoreAction(option_strings=[], dest='names', nargs=2, const=None, default=None, type=None, choices=None, help=None, metavar=None)
# ?表示参数的值为0个或者多个,用default指定没有提供参数时的默认值
>>> parser.add_argument('chrs', nargs = '?', default = 'chr1')
_StoreAction(option_strings=[], dest='chrs', nargs='?', const=None, default='chr1', type=None, choices=None, help=None, metavar=None)
# *表示参数的值为0个或者多个
>>> parser.add_argument('names', nargs = '*')
_StoreAction(option_strings=[], dest='names', nargs='*', const=None, default=None, type=None, choices=None, help=None, metavar=None)
# 加号表示参数的值为1个或者多个
>>> parser.add_argument('samples', nargs = '+')
_StoreAction(option_strings=[], dest='samples', nargs='+', const=None, default=None, type=None, choices=None, help=None, metavar=None)

通过多个参数的组合,提供了强大的命令行传参方式,尽管在python中还有其他模块也提供了命令行参数的处理功能,但是官方还是首推使用argparse来处理命令行参数。

·end·

—如果喜欢,快分享给你的朋友们吧—

原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!

本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档