在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。万能的python就自带了argprase包使得这一工作变得简单而规范。PS:optparse包是类似的功能,只不过写起来更麻烦一些。
如果脚本很简单或临时使用,没有多个复杂的参数选项,可以直接利用sys.argv
将脚本后的参数依次读取(读进来的默认是字符串格式)。
sys.argv[]的用法简明解释
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,因为从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。
比如如下名为test.py的脚本:
import sys
print "Input argument is %s" %(sys.argv)
print "Input argument is %s" %(sys.argv[0])
print "Input argument is %s" %(sys.argv[1])
在shell脚本中运行python test.py help
可以得到以下的结果。
[root@skyeye mnt]# python test.py help
Input argument is ['test.py', 'help']
Input argument is test.py
Input argument is help
1) 一般形式
但是大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的。
同样用名为test.py的脚本举个栗子:
# coding=utf-8
import argparse
# 创建 ArgumentParser() 对象
parser = argparse.ArgumentParser(description="your script description") # description参数可以用于插入描述脚本用途的信息,可以为空
# 调用 add_argument() 方法添加参数
parser.add_argument('-p','--port', type=int, help=“input a int num!”, default=80)
# 使用 parse_args() 解析添加的参数
args = parser.parse_args() # 将变量以标签-值的字典形式存入args字典
print args.port
运行python test.py
[root@skyeye mnt]# python l.py
80
[root@skyeye mnt]# python l.py -p 10
10
[root@skyeye mnt]#
读取文件
之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。
parser.add_argument('file', type=argparser.FileType('r')) # 读取文件
args = parser.parse_args()
for line in args.file:
print line.strip()
参数默认值
一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。
parser.add_argument('filename', default='text.txt')
这个时候至直接运行python text.py
就能得到Read in text.txt
而不需要输入文件名了。
候选参数选择
表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:
parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])