python 自动化之参数解析
故事背景
平常办公过程中经常遇到一些繁琐的体力劳动。
作为一名程序员,做一些繁琐的体力劳动总是感觉浪费时间。
所以经常性的会发挥一下程序员的优势,机械化转换成自动化。
对我来说自动化最常用的工具还是python。
一则简单易学,二则有丰富的基础库。
自动化脚本,每次业务变动就要修改代码自然不够优雅。
所以本章主要聊下如何处理python的参数传入问题。
入口函数 关于参数获取
python的默认入口函数大家一定熟悉不过
if __name__ == '__main__':
pass
这里我们用到sys库
import sys
if __name__ == '__main__':
print(sys.argv)
运行
$ python3 test.py arg1 arg2 arg3
['test.py', 'arg1', 'arg2', 'arg3']
参数位数为4个
可以看到,参数是从命令后的空格开始算起的,包括脚本执行文件sys.argv[0]是文件名
所以一般参数获取我们会使用
sys.argv[1:]
来截取参数部分
参数解析
getopt模块 是专门用于处理命令行参数的模块,用于处理命令行选项和参数.
以下是python 3.9.2的文档对getopt方法的描述
getopt.getopt(args, shortopts, longopts=[])
""""
解析命令行选项与形参列表。 args 为要解析的参数列表,不包含最开头的对正在运行的程序的引用。 通常这意味着 sys.argv[1:]。 shortopts 为脚本所要识别的字母选项,包含要求后缀一个冒号 (':';即与 Unix getopt() 所用的格式相同) 的选项。
注解 与 GNU getopt() 不同,在非选项参数之后,所有后续参数都会被视为非选项。 这类似于非 GNU Unix 系统的运作方式。
如果指定了 longopts,则必须为一个由应当被支持的长选项名称组成的列表。 开头的 '--' 字符不应被包括在选项名称中。 要求参数的长选项后应当带一个等号 ('=')。 可选参数不被支持。 如果想仅接受长选项,则 shortopts 应为一个空字符串。 命令行中的长选项只要提供了恰好能匹配可接受选项之一的选项名称前缀即可被识别。 举例来说,如果 longopts 为 ['foo', 'frob'],则选项 --fo 将匹配为 --foo,但 --f 将不能得到唯一匹配,因此将引发 GetoptError。
返回值由两个元素组成:第一个是 (option, value) 对的列表;第二个是在去除该选项列表后余下的程序参数列表(这也就是 args 的尾部切片)。每个被返回的选项与值对的第一个元素是选项,短选项前缀一个连字符 (例如 '-x'),长选项则前缀两个连字符 (例如 '--long-option'),第二个元素是选项参数,如果选项不带参数则为空字符串。 列表中选项的排列顺序与它们被解析的顺序相同,因此允许多次出现。 长选项与短选项可以混用。
"""
由文档可知
无参数值,短参数定义
target=getopt.getopt(args,"h")
print(str(target))
结果
> python3 test.py -h
> ([('-h', '')], [])
有参数值,短参数定义
target=getopt.getopt(args,"h:")
print(str(target))
结果
> python3 test.py -h args
> ([('-h', 'args')], [])
无参数值,长参数定义
target=getopt.getopt(args,"",["help"])
print(str(target))
结果
> python3 test.py --help args
> ([('--help', '')], [])
有参数值,长参数定义
target=getopt.getopt(args,"",["help="])
print(str(target))
结果
> python3 test.py --help args
> ([('--help', 'args')], [])
如果参数不符合定义规范则会抛出GetoptError异常
try:
target = getopt.getopt(argv,"h:")
print(str(target))
except getopt.GetoptError as e:
print(e)
结果
> python3 test.py -h
> option -h requires argument
示例-路径参数获取
#!/usr/bin/python3
#-*- coding:utf-8 -*-
import sys
import getopt
import os
def help():
hstring="""
-h help info
-p path into
test.py -p <path>
"""
print(hstring)
def foo(argv):
try:
opts,args = getopt.getopt(argv,"hp:")
for opt,arg in opts:
if opt in ("-h"):
help()
if opt in ("-p"):
path = os.path.abspath(arg)
print("input path:%s" % path)
except getopt.GetoptError as e:
print(e)
help()
if __name__ == '__main__':
foo(sys.argv[1:])
执行结果
> python3 test.py -p ./
> input path:/Users/boxu/Desktop/test