come from : https://blog.youkuaiyun.com/u011520181/article/details/79955927
一、sys 模块
在 Python 中,通过 sys 模块中的 sys.argv 可以访问到所有的命令行参数,它的返回值是包含所有命令行参数的列表。
sys.argv :是命令行参数列表
len(sys.argv) :是命令行参数个数
sys.argv[0]:参数1
sys.argv[1]:参数2
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@Time : 2018-04-11 17:58
@Author : jianjun.wang
@Email : alanwang6584@gmail.com
"""
import sys
def main():
print 'arg num : ', len(sys.argv)
print 'args : ', sys.argv
print 'script name : ', sys.argv[0]
for i in range(len(sys.argv)):
print "arg[{0}] = {1}".format(i, sys.argv[i])
if __name__ == "__main__":
main()
命令行中输入:python D023_get_arg_sys.py alan 3
输出
arg num : 3
args : ['D023_get_arg_sys.py', 'alan', '3']
script name : D023_get_arg_sys.py
arg[0] = D023_get_arg_sys.py
arg[1] = alan
arg[2] = 3
二、getopt 模块
有时候我们需要传递多个参数,每个参数表示不同的含义,而且有时候有的参数有,有的参数没有。比如我们需要从打点文件(file)中分析某国家(country)某个版本(version)的统计结果,可以看到这里有四个参数:脚本名、file、country、country,但有时可能从文件中查某版本的(只有 脚本名、file、version 参数),或查某国家的(脚本名、file、country 参数),这时用 sys 模块就比较麻烦了,因为,第三个参数有可能是 country、也可能是 version,也可能都没有(如分析该文件中所有国家所有版本的数据)。这时用 getopt 就可以很好的解决这个需求。
getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(--)。
该模块提供了两个方法及一个异常处理来解析命令行参数。
getopt.getopt 方法
getopt.getopt 方法用于解析命令行参数列表,语法格式如下:
options, args = getopt.getopt(args, shortopts, longopts=[])
方法参数说明:
shortopts:短格式参数串。shortopts 后的冒号(:)表示如果设置该选项,必须有附加的参数,不带冒号表示该选项没有附加参数如:"h f: v:"h 后面没有冒号,表示该选项没有附加参数,如用于输出命令用法f 和 v 后面带有冒号,表示该选项有附加参数
longopts:长格式参数列表。longopts 后的等号(=)表示如果设置该选项,必须有附加的参数,否则就没有附加参数如:["help", "file=", "version="]help 后面没有等号,表示该选项没有附加参数file 和 version 后面带冒号,表示如果设置该选项,必须有附加参数
longopts: 以列表的格式定义,long_options 后的等号(=)表示如果设置该选项,必须有附加的参数,否则就不附加参数。
返回值含义:options:元组列表,每个元组的形式为:(选项, 附加参数),如:('-f', 'data.csv')args:包含那些没有 '-' 或 '--' 的参数列表
异常: getopt.GetoptError:在没有找到参数列表,或选项的需要的参数为空时会触发该异常 异常的参数是一个字符串,表示错误的原因,属性 msg 和 opt 为相关选项的错误信息
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@Time : 2018-04-11 19:26
@Author : jianjun.wang
@Email : alanwang6584@gmail.com
"""
import sys
import getopt
def main(args):
file=''
country=''
version=''
"""
语法格式:
options, args = getopt.getopt(args, shortopts, longopts=[])
参数含义:
args:要解析的命令行参数列表,sys.argv[1:],过滤掉 sys.argv[0],它是执行脚本的名字,不算命令行参数
shortopts:短格式参数串。shortopts 后的冒号(:)表示如果设置该选项,必须有附加的参数,不带冒号表示该选项没有附加参数
如:"hf:v:"
h 后面没有冒号,表示该选项没有附加参数,如用于输出命令用法
f 和 v 后面带有冒号,表示该选项有附加参数
longopts:长格式参数列表。longopts 后的等号(=)表示如果设置该选项,必须有附加的参数,否则就没有附加参数
如:["help", "file=", "version="]
help 后面没有等号,表示该选项没有附加参数
file 和 version 后面带冒号,表示如果设置该选项,必须有附加参数
返回值含义:
options:元组列表,每个元组的形式为:(选项, 附加参数),如:('-f', 'data.csv')
args:包含那些没有 '-' 或 '--' 的参数列表
异常:
getopt.GetoptError:在没有找到参数列表,或选项的需要的参数为空时会触发该异常
异常的参数是一个字符串,表示错误的原因,属性 msg 和 opt 为相关选项的错误信息
"""
try:
options, args = getopt.getopt(args, "hf:c:v:", ["help", "file=", "country=", "version="])
except getopt.GetoptError:
print 'Error: get_args.py -f <file> -c <country> -v <version>'
print ' or: get_args.py --file=<file> --country=<country> --version=<version>'
sys.exit(2)
for opt, arg in options:
if opt in ("-h", "--help"):
print 'get_args.py -f <file> -c <country> -v <version>'
print 'or: get_args.py --file=<file> --country=<country> --version=<version>'
sys.exit()
elif opt in ("-f", "--file"):
file = arg
elif opt in ("-c", "--country"):
country = arg
elif opt in ("-v", "--version"):
version = arg
for i in range(0, len(args)):
print "args[{0}] = {1}".format(i, args[i])
print 'file : ', file
print 'country : ', country
print 'version : ', version
if __name__ == "__main__":
# 注意这里要排除 argv[0],它是本脚本名,不算做命令行参数
main(sys.argv[1:])
短参数测试
命令行中输入:
python D023_get_args_getopt.py -f data.csv -c china -v 6.3.2 a 2
输出:
args[0] = a
args[1] = 2
file : data.csv
country : china
version : 6.3.2
长参数测试
命令行中输入:
python D023_get_args_getopt.py --file=data.csv --country=china --version=6.3.2 a 3
输出:
args[0] = a
args[1] = 3
file : data.csv
country : china
version : 6.3.2