python命令行参数
python获取命令行参数的方式主要有三种:
- sys.argv
- getopt
- argparse
sys.argv
sys.argv是python中最基本、最简单的获取命令行参数的方式。sys.argv返回一个命令行参数列表。
一个例子
#vim parse_command_line_option.py
import sys
# 命令行参数个数
print('命令行参数个数:%s' % len(sys.argv))
# 命令行参数
print('命令行参数:%s' % ' '.join(sys.argv))
# 第一个参数表示脚本名
print('脚本名称:%s' % sys.argv[0])
运行结果
$ python parse_command_line_option.py o1params o2params o3params
命令行参数个数:4
命令行参数:parse_command_line_option.py o1params o2params o3params
脚本名称:parse_command_line_option.py
getopt
此模块帮助脚本解析sys.argv中的命令行参数,它支持短选项和长选项(-
和--
)。这个模块提供了两个函数和一个异常:
- getopt
- gnu_getopt
- GetoptError
getopt
getopt是我们经常使用的函数,下面我们来看看它的函数说明吧。
getopt(args, shortopts, longopts=[]) -> opts, args
args: 指的是当前脚本需要解析的参数列表,通常是sys.argv[1:]shortopts: 短参数,类似于 python test.py -h。短参数是一个字符串,如果带有冒号
:
表示这个选项后面必须要有一个参数。比如'-h-v-i:-o:'
表示-i
和-o
的后面需要接参数。longopts: 长参数,类似于 python test.py --help。长参数是一个可选参数,它是一个list列表。如果选项后面必须接参数,则需要加个
=
。比如['help', 'version', 'input=', 'output=']
表示input
和output
后面需要接参数。调用方式:
短参数:-参数名[空格]参数值
长参数:--参数名=参数值
getopt函数的返回值是一个包含两个列表的元组
-
opts
-
args
opts是一个列表,列表每个值是
(option, value)
对。比如("-o", "outputname")
args其他参数列表,它包含不属于格式信息的剩余的命令行参数。
gnu_getopt
这个函数的工作方式与getopt()类似,只是默认使用的是GNU样式扫描模式。这个函数用的较少,可以使用print(getopt.__doc__)
或help(getopt.gnu_getopt)
查看说明文档。
GetoptError
异常类处理对象,抛出错误信息。
一个例子:
#vim parse_command_line_option.py
import sys
import getopt
try:
# opts: 包含选项和值 args: 不属于格式信息的剩余的命令行参数
# :和=表示后面必须要接参数
opts, args = getopt.getopt(sys.argv[1:], '-h-v-i:-o:', ['help', 'version', 'input=', 'output='])
except getopt.GetoptError as e:
print(e)
print('usage: python %s -i <inputfile> -o <outputfile>' % __file__)
print(' or: python %s --input=<inputfile> --output=<outputfile>' % __file__)
return
for option, value in opts:
if option in ('-h', '--help'):
print('usage: python %s -i <inputfile> -o <outputfile>' % __file__)
print(' or: python %s --input=<inputfile> --output=<outputfile>' % __file__)
elif option in ('-v', '--version'):
print('Version is 0.01')
elif option in ('-i', '--input'):
print('input file is: %s' % value)
elif option in ('-o', '--output'):
print('output file is: %s' % value)
print('args = %s' % args)
for index, arg in enumerate(args):
print('Other argument_%s: %s' % (index+1, arg))
运行结果:
$ python parse_command_line_option.py -h
usage: python parse_command_line_option.py -i <inputfile> -o <outputfile>
or: python parse_command_line_option.py --input=<inputfile> --output=<outputfile>
args = []
$ python parse_command_line_option.py -i inputfile -o outputfile o1params o2params o3params
input file is: inputfile
output file is: outputfile
args = ['o1params', 'o2params', 'o3params']
Other argument_1: o1params
Other argument_2: o2params
Other argument_3: o3params
$ python parse_command_line_option.py --input=inputfile --output=outputfile o1params
input file is: inputfile
output file is: outputfile
args = ['o1params']
Other argument_1: o1params
$ python parse_command_line_option.py -t testfile
option -t not recognized
usage: python parse_command_line_option.py -i <inputfile> -o <outputfile>
or: python parse_command_line_option.py --input=<inputfile> --output=<outputfile>
argparse
argparse
模块是标准库中最大的模块之一,拥有大量的配置选项,这里只说明最常用、最基本的用法。argparse
自带说明文档,用python filename.py -h
或者python filename.py --help
就可以查看使用说明,非常方便,不像getopt一样要自己写说明。推荐使用argparse
模块解析命令行参数。
doc文档:https://docs.python.org/zh-cn/dev/library/argparse.html
一个简单使用:
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='Simple argparse test')
parser.add_argument('-t', dest='test', metavar='test', action='store', help='test option')
args = parser.parse_args()
print(args.test)
运行结果:
$ python parse_command_line_option.py -h
usage: parse_command_line_option.py [-h] [-t test]
Simple argparse test
optional arguments:
-h, --help show this help message and exit
-t test This is a test param
$ python parse_command_line_option.py -t helloworld
helloworld
argparse模块的使用只需要四步就行,
-
创建一个
ArgumentParser
实例 -
使用
add_argument()
方法声明想要支持的选项 -
使用
parse_args()
方法解析命令行参数 -
获取参数值
ArgumentParser
实例的description参数是一个描述文字,在说明中可以看到。ArgumentParser
实例还有一些其他参数,但是不常用。
add_argument()
的参数说明:
参数 | 说明 |
---|---|
name or flags | 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo 。 |
dest | 解析结果被指派给属性的名字,即调用时候的名字。如果不指定,则会用第一个参数name or flags 的名称。 |
metavar | 生成帮助信息,比如以上的[-t test] 和-t test 中的test。如果没有metavar ,会使用大写的dest 参数。 |
action | 指定跟属性对应的处理逻辑, 通常的值为 store ,存储参数的值,这个是默认的动作。 |
nargs | nargs 命名参数关联不同数目的命令行参数到单一动作。 |
default | 默认值,如果一个选项需要默认值,可以用default 设置 |
type | 默认情况下,解析器会将命令行参数当作简单字符串读入。type默认是str ,也可以指定为int 、float 等 |
choices | 表示受限制的参数值。可以是一个list对象、set对象等。 |
required | 默认required=False ,可以用required=True 表示必选参数 |
help | 参数简短描述的字符串 |
一些参数的详细说明
name or flags
add_argument()
方法必须知道它是否是一个选项,例如 -f
或 --foo
,或是一个位置参数,例如一组文件名。第一个传递给 add_argument()
的参数必须是一系列 flags 或者是一个简单的参数名。如果是位置参数,指定的属性就是它本身,不能再用dest
指定。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='Name or flags test')
parser.add_argument('-f', '--foo')
# 不能这样写 parser.add_argument('bar', dest='bar_arg')
parser.add_argument('bar')
args = parser.parse_args()
print(dir(args))
print(args.foo)
print(args.bar)
运行结果
$ python parse_command_line_option.py -f o1param o2param
['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'bar', 'foo']
o1param
o2param
$ python parse_command_line_option.py --foo o1param o2param
['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'bar', 'foo']
o1param
o2param
其中的
bar
是位置参数,是必须要传入的参数。
action
ArgumentParser
对象将命令行参数与动作相关联。这些动作可以做与它们相关联的命令行参数的任何事,尽管大多数动作只是简单的向parse_args()
返回的对象上添加属性。action
命名参数指定了这个命令行参数应当如何处理。相应的动作有:
'store'
存储参数的值,这个是默认动作。
'store_const'
存储被const
命名参数指定的值。选项的值会变成一个固定值。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='Store const test')
parser.add_argument('--foo', action='store_const', const=42)
args = parser.parse_args()
print(args.foo)
结果
$ python parse_command_line_option.py --foo bar
usage: parse_command_line_option.py [-h] [--foo]
parse_command_line_option.py: error: unrecognized arguments: bar
$ python parse_command_line_option.py --foo
42
如上,给
--foo
传参数会报错;foo的固定值变成了42
'store_true' and 'store_false'
这些是'store_const'
分别用作存储True
和False
值的特殊用例。它们的默认值对应的是Flase
和True
。比如一个选项--foo
,action
是'store_true'
,如果运行时命令行没有指定--foo
,则存储的值是False
;如果运行时制定了--foo
,则存储的值是True
。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='Store ture and false test')
parser.add_argument('--foo', action='store_true')
parser.add_argument('--bar', action='store_false')
parser.add_argument('--baz', action='store_false')
args = parser.parse_args()
print(args.foo)
print(args.bar)
print(args.baz)
结果
$ python parse_command_line_option.py
False
True
True
$ python parse_command_line_option.py --foo --bar
True
False
True
如上,
action='store_true'
的--foo
,没有这个选项时存储的是False
;有这个选项时存储的是True
。
'append'
存储一个列表,并且将每个参数值追加到列表中。在允许多次使用选项时很有用。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='Store append test')
parser.add_argument('--foo', action='append')
args = parser.parse_args()
print(args.foo)
结果
$ python parse_command_line_option.py --foo o1param
['o1param']
$ python parse_command_line_option.py --foo o1param --foo o2param
['o1param', 'o2param']
nargs
ArgumentParser
对象通常关联一个单独的命令行参数到一个单独的被执行的动作。 nargs
命名参数关联不同数目的命令行参数到单一动作。可以思考一下和action
中append
的区别。支持的值有:
N(一个整数)
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='nargs test')
parser.add_argument('--foo', nargs=2)
parser.add_argument('--bar', nargs=1)
args = parser.parse_args()
print(args.foo)
print(args.bar)
结果
$ python parse_command_line_option.py --foo o1param o2param --bar o3param
['o1param', 'o2param']
['o3param']
'?'
表示有或者没有选项的值。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='nargs test')
parser.add_argument('--foo', nargs='?')
args = parser.parse_args()
print(args.foo)
结果
$ python parse_command_line_option.py --foo
None
$ python parse_command_line_option.py --foo o1param
o1param
'*'
表示0个或者大于0个。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='nargs test')
parser.add_argument('--foo', nargs='*')
args = parser.parse_args()
print(args.foo)
结果
$ python parse_command_line_option.py
None
$ python parse_command_line_option.py --foo
[]
$ python parse_command_line_option.py --foo o1param
['o1param']
$ python parse_command_line_option.py --foo o1param o2param
['o1param', 'o2param']
'+'
表示大于等于一个。其实'?'
、'*'
、'+'
和正则表达式意义差不多。
choices
从choices
选项中指定参数的值。
例子
#vim parse_command_line_option.py
import argparse
parser = argparse.ArgumentParser(description='choices test')
parser.add_argument('--foo', choices=['o1param', 'o2param', 'o3param'], default='o3param')
args = parser.parse_args()
print(args.foo)
结果
$ python parse_command_line_option.py
o3param
$ python parse_command_line_option.py --foo test_param
usage: parse_command_line_option.py [-h] [--foo {o1param,o2param,o3param}]
parse_command_line_option.py: error: argument --foo: invalid choice: 'test_param' (choose from 'o1param', 'o2param', 'o3param')
$ python parse_command_line_option.py --foo o2param
o2param
如上,
default
表示默认值;如果输入一个不是choices
的值会报错。