Python中常用的获取命令行参数的方法有三种,分别可适用于不同的场景。

直接从sys.argv中获取

sys.agrv保存了命令行的参数列表,其中,sys.argv[0]保存的是脚本的名称,所以要获取自己传入的参数时,需要从第二个元素开始,参数的顺序与sys.argv中一致。

1
2
3
4
# m1.py
import sys
print 'The length of sys.argv is %d' % len(sys.argv)
print 'Argument list: ',str(sys.argv)
1
2
3
python m1.py first second third
The length of sys.argv is 4
Argument list: ['m1.py', 'first', 'second', 'third']

获这种方法适用于参数较少的时候,使用者按照固定顺序将所需参数传入即可,同时,取的参数都是str类型,需要用户自行转换为所需类型。

使用getopt.getopt获取参数

当参数比较多的时候我们可能需要明确指定参数名称,又或者我们可能需要一些可选参数,使用第一种方法就不是那么方便了,所以我们可以用getopt来解析参数,其调用方式如下所示。

1
getopt.getopt(args, options, [long_options])

  • args是将被解析的参数列表
  • options是需要识别的参数名列表,当然不一定非得有参数,比如-h用来输出帮助信息,当有对应参数的时候,需要在标识符后边添加一个分号”:”。
  • long_options可选参数是长参数名列表,如–long-name,当有参数传入的时候,需要在右边添加等号”=”。

函数返回一个二元组,第一个元素是(option,value)列表,第二个元素是未识别的参数列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#m2.py
#coding:utf-8
import sys, getopt

opts, left_args = getopt.getopt(sys.argv[1:], 'i:h', ['in=','help']) #第一个参数是脚本名,不传入
for opt, val in opts:
if opt == '-h':
print '不含参数Help Info'
if opt == '--help':
print '不含参数Help Info2'
if opt == '-i':
print '短参数-i: ', val
if opt == '--in':
print '长参数--ifile: ', val
print '未识别参数:', str(left_args)

运行结果

1
2
3
4
5
6
python m2.py -i short_arg --in=long_arg -h --help left_arg
短参数-i: short_arg
长参数--ifile: long_arg
不含参数Help Info
不含参数Help Info2
未识别参数: ['left_arg']

这种方法已经能够应对大多数情况了,不过获取的val仍是str类型。

使用argparse模块解析参数

argparse 模块最大的特点就是可以建立用户友好的命令行接口,可以实现指定需要传入的参数,自动解析sys.argv,自动生成帮助信息、错误信息等。如果要使用getopt来达到同样的效果,就需要写很多很多的代码啦。

argparse 通过ArgumentParser对象实现参数的解析,可以很友好地实现帮助信息、参数传入前缀、参数冲突等特性,其通过add_argument方法添加具体的参数——包括位置参数和可选参数等,同时可以指定这些参数的个数、转换类型、默认值、限定枚举值、是否必须以及别名等信息。argparse的使用会比上述两个复杂一些,但是其功能更强大、使用更友好一些。具体使用方法可以单独写一篇文章了,但是官方文档已经给出了很详细的示例了,所以这里就不在赘述,感兴趣的可以参阅argparse — Parser for command-line options, arguments and sub-commands

总结

上述三个方法从简单到复杂,功能从单一到丰富,开发人员可根据需要选择。

参考

  1. Python Command Line Arguments
  2. argparse — Parser for command-line options, arguments and sub-commands