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=']表示inputoutput后面需要接参数。

调用方式:

短参数:-参数名[空格]参数值

长参数:--参数名=参数值

​ 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模块的使用只需要四步就行,

  1. 创建一个 ArgumentParser 实例

  2. 使用 add_argument() 方法声明想要支持的选项

  3. 使用parse_args()方法解析命令行参数

  4. 获取参数值

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,也可以指定为intfloat
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'分别用作存储TrueFalse值的特殊用例。它们的默认值对应的是FlaseTrue。比如一个选项--fooaction'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 命名参数关联不同数目的命令行参数到单一动作。可以思考一下和actionappend的区别。支持的值有:

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的值会报错。

原文地址:https://www.cnblogs.com/shengmading/p/14481564.html