有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的)。在C语言里,main函数的原型为int main(int argc, char **argv),这里主要指Linux平台, argv指的是命令行传入的参数个数(程序的name为第一个参数),而argv则是一个指针数组,每一个元素为指向一个命令行参数的指针。在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素也为程序名称。
看下面的例子:
1 2 3 4 5 6 7 |
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys if __name__ == '__main__': for item in sys.argv: print item |
在命令行运行./test.py 1 2 3,结果如下:
1 2 3 4 5 |
$ python test.py 1 2 3 test.py 1 2 3 |
用这种方式可以进行命令行参数的判断从而进行不同的动作。而Python的标准库里实际上有专门处理命令行参数的getopt模块,getopt模块用于抽出命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式和长选项模式。getopt里面的提供了2个函数和一个类,我们主要使用getopt函数,先看下函数原型:
1 |
def getopt(args, shortopts, longopts = []): |
( [命令行参数列表], “短选项”, [长选项列表] )
先看一个例子,这样会便于理解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import getopt try: opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="]) except getopt.GetoptError: print str(err) sys.exit(2) for o,a in opts: print o,a for i in args: print i |
1. 处理所使用的函数叫getopt() ,因为是直接使用import导入的getopt模块,所以要加上限定getopt才可以。
2. 使用sys.argv[1:]过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
3. 使用短格式分析串”ho:”,当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个”:” 号 。所以”ho:v” 就表示”h”是一个开关选项;”o:” 则表示后面应该带一个参数,”v”也是一个开关选项。
4. 使用长格式分析串列表:[“help”, “output=”],长格式串也可以有开关状态,即后面不跟”=” 号。如果跟一个等号则表示后面还应有一个参数,这个长格式表示”help”是一个开关选项;”output=” 则表示后面应该带一个参数。
5. 调用getopt函数,函数返回两个列表:opts和args,opts为分析出的格式信息,args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表,每个元素为:( 选项串, 附加参数) ,如果没有附加参数则为空串” 。
6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。
如上面解释的一个命令行例子为:
1 |
'-h -o file -v --help --output=out file1 file2' |
在分析完成后,opts应该是:
1 |
[('-h', ''),('-o', 'file'),('-v', ''),('--help', ''), ('--output', 'out')] |
而args则为:
1 |
['file1', 'file2'] |
下面就是根据不同参数处理:
1 2 3 4 5 6 7 8 |
$ python test.py -h -o file -v --help --output=out file1 file2 -h -o file -v --help --output out file1 file2 |
注意,如果你输入的短选项或者长选项不在getopt.getopt定义的参数内,执行时就会报错的哦。
模拟一个登陆脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import getopt def usage(): print ''' python sys.srgv[0] [options] [value]... [options] --help -h, --host [string] -P, --port [int] -u, --user [string] -p, --passwd [string] ''' def main(): shortargs = 'h:P:u:p:' longargs = ["help","host","port","user=","passwd="] try: opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs) except getopt.GetoptError: usage() sys.exit(1) for o,a in opts: if o == "--help": usage() elif o in ("-h","--host"): if a == "127.0.0.1": print "Host=127.0.0.1" else: usage() elif o in ("-P","--port"): if a == "3306": print "port=3306" else: usage() elif o in ("-u","--user"): if a == "root": print "user=root" else: usage() elif o in ("-p","--passwd"): if a == "123456": print "password=123456" else: usage() else: usage() if __name__ == "__main__": if ( len( sys.argv ) == 1 ): usage() print len((sys.argv)) sys.exit(1) else: main() |
执行脚本
1 2 3 4 5 |
$ python test.py -h 127.0.0.1 -P 3306 --user=root --passwd 123456 Host=127.0.0.1 port=3306 user=root password=123456 |
可以看出,这个脚本非常死,任何一个选项或参数不正常就会异常输出。当然,一个登陆选项还有很多东西要做,这里只是使用一个getopt模块而已。