在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的)。在C语言里,main函数的原型为int main(int argc, char **argv),这里主要指linux平台, argc指的是命令行传入的参数个数(程序的name为第一个参数),而argv则是一个指针数组,每一个元素为指向一个命令行参数的指针。在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素也为程序名称。
一、sys.argv
sys.argv为python的命令行参数列表,sys.argv[0]保存脚本的文件名,从参数1开始,sys.argv保存的是命令行的其他参数,len(sys.argv)为包括脚本文件名在内的命令行参数的个数。
例如:
import sys
print sys.argv[0] ##脚本名
print sys.argv[1] ## 第一个参数
print sys.argv ###参数数组
print len(sys.argv) ##参数个数
for i in range(1, len(sys.argv)):
print "参数", i, sys.argv[i]
>>>python argv.py hello world
argv.py
['argv.py', 'hello', 'world']
3
参数 1 hello
参数 2 world
二、getopt.getopt函数()
getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(--)。模块
里面的提供了2个函数和一个类,
主要使用getopt函数,先看下函数原型:
def getopt(args, shortopts, longopts = [ ])
我们先看一个实例以方便理解:
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])
except getopt.GetoptError:
# print help information and exit:
for name, value in opts:
print name, value
for item in args:
print item
说明如下:
1. 处理所使用的函数叫getopt() ,因为是直接使用import 导入的getopt 模块,所以要加上限定getopt 才可以。2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。3. 使用短格式分析串"ho:" 。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。5. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。 如果输入的命令行参数为:
'-h -o file --help --output=out file1 file2'
则输出为:
-h
-o file
--help
--output out
file1
file2
即在分析完成后,opts应该是:
[('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]
而args应该为['file1','file2']
再然后就可以根据参数的实际情况来进行处理:
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-o", "--output"):
output = a
最后再给出两个实例(参数列表中长选项模式可以不带=号)
第一个
>>>import getopt
>>>args = '-a -b -cfoo -d bar a1 a2'.split()
>>>args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>>optlist, args = getopt.getopt(args, 'abc:d:')
>>>optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
>>>args
['a1', 'a2']
第二个
>>>s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>>args = s.split()
>>>args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>>optlist, args = getopt.getopt(args, 'x', ['condition=', 'output-file=', 'testing'])
>>>optlist
[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
>>>args
['a1', 'a2']