个人博客,记录知识防止遗忘
python 命令行参数获取
python 命令行参数获取

python 命令行参数获取

python脚本经常需要从命令行获取参数,标准库里有个getopt模块,可以很方便的达成目的
常用的有2个函数 : getopt 和 gnu_getopt

2者的区别是,getopt的所有的选项(短选项和长选项)都必须在前面, "操作对象" 要放在选项的后边,不能乱放,否则会将“操作对象”之后的所有选项都识别为不同的“操作对象”

而 gnu_getopt并无此要求,选项(opts)和 操作对象(args)可以混合在一起,使用起来更灵活

内容大纲

1    语法介绍

getopt模块和gnu_getopt语法的定义基本相同,这里先介绍getopt 毕竟gnu_getopt 是完全兼容 get_opt的

getopt共有3段定义,彼此间用逗号隔开。

opts,args = getopt.getopt(sys.argv[1:],"h:p:o",["name=","help"])

上式中
首先定义了参数的起始。
随后定义了短参数和长参数 会赋值给opts;
除此之外剩下的命令参数都算作是 "操作对象",会将其赋值给args

opts和args都是列表,opts是个二元值的列表,格式为选项和对应的值(值可以为空);args是单值列表

sys.argv[1:] 
表示从第2个参数开始;毕竟第一个参数其实是脚本自身名称
"h:p:o" 
这里定义的是短选项(必须单字母),即 -h -p 以及 -o
需要注意的是,若字母后价格冒号:  则代表该选项是可以赋值的,例如 -h 127.0.0.1 
若字母后没有冒号: 则表示该选项是布尔型,只有激活和未激活2种状态
["name=","help"]
这里定义的是长选项(至少2个字母),即 --name 和 --help
要注意的是,若长选项后加了等号=  则表示该选项是可以赋值的,例如 --name=caojie
若选项后没有等号=  则表示该选项是布尔型,只有激活和未激活2种状态
args
依次经过上述定义之后,若还有剩余, 则会自动归为"操作对象",会将其以列表的形式赋值给args
取值时要注意

2    实际使用举例

这里编写了一个简单的python脚本,脚本主要实现以下功能:
① 获取命令行选项参数并打印出来
② 如果选项有 –help 或 -o 则只打印帮助信息
③ 如果未指定操作对象(args)或 操作对象不唯一 ,则输出提示信息
为了简单一些,不做任何异常处理

import getopt
import sys

# 使用 getopt 函数
opts,args = getopt.getopt(sys.argv[1:],"h:p:o",["name=","help"])

# 使用 gnu_getopt 函数
# opts,args = getopt.gnu_getopt(sys.argv[1:],"h:p:o",["name=","help"])

hhh = '''\n===============================================
请指定以下必填参数: -h -p --name 
使用  -o  或  --help  来显示帮助信息"
===============================================\n'''

for key,value in opts:
        if key == "-o" or key == "--help":
                print(hhh)
                exit(0)

if len(args) > 1:
        print('操作对象不唯一')
else:
        for key,value in opts:
                print('{0:>10s}  -----  {1:<20s}'.format(key,value))
        print('\n操作对象是: \n' + args[0])

image.png

3    getopt和gnu_getopt的区别

若采用getopt函数,则当选项和操作对象混用时,会将操作对象及其后的选项参数都识别为操作对象。
如下图,将操作对象aaaaa 和 长选项--name=caojie 都识别成了操作对象,从而触发不唯一提示
image.png
若使用gnu_opt函数,则选项(opts)和操作对象(args)可以混用,使用起来更灵活
image.png

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注