对于脚本编程而言,经常需要从命令行传递参数到脚本中。对于命令行参数的定义和使用,有一套完整的规则,以linux上的ls命令为例
ls --helpUsage: 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命令的帮助文档,输出的内容很多,这里我只截取了部分。从输出的内容可以看到,命令行参数可以分为两大类
option表示可选参数,有两种写法,一种是一个短横杠后面加选项名称,称之为短选项,另外一种是两个短横杠后面加选项名称,称之长选项。位置参数是必须提供的,前面不需要短横杠的修饰,直接就是参数名称,ls命令的用法示意如下
其中-l就是一个选项, dir则是一个位置参数, 要在python脚本中实现这样的命令行传参,可以借助内置模块argparse来实现,基本用法示意如下
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))
在命令行运行该脚本
usage: test.py [-h] [-l] dir
test.py: error: the following arguments are required: dir
可以看到,argparse为脚本自动添加了-h选项,用来查看帮助文档
python test.py -husage: 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
表示参数的名称,选项可以同时提供短选项和长选项,也可以只提供其中的一种,位置参数直接写参数名称即可, 用法如下
>>> 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的值来实现,用法如下
# 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
参数的默认值, 用法如下
_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, 可以将可选参数变为必须参数,用法如下
_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的值会显示在屏幕上, 用法如下
_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的值来访问对应的参数,用法如下
>>> 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的值, 该参数仅在显示帮助信息时有用,没有其他实际含义,用法如下
>>> 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
其值为一个列表,指定了参数的可选范围,如果提供的值超出范围,程序会报错, 用法如下
_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, 只存储对应的值,还有其他的可选值,用法如下
>>> 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参数对应的常数,用于固定参数的值,用法如下
>>> 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 的列表,用法如下
# 指定一个具体的数值,对参数的个数进行限定# 提供的参数个数不对,会报错
>>> 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·
一个只分享干货的
生信公众号