命令行解析工具_python-Linux-argparse
命令行解析工具
命令行1.
import sys
print(type(sys.argv), sys.argv)
sys.argv 是一个列表,其中包含了被传递给 Python 脚本的命令行参数, argv[0] 为脚本的名称
命令行工具
sys.argv
getopt 解析
optparse 解析
argparse 解析
Gooey 基于命令行的程序转变成具备完整图形界面的应用 自动化脚本、数据处理工具
getopt
getopt: 一个忠实地复刻过程式 C getopt API 的模块
1.定义
将命令行参数解析为一个选项列表和一个参数列表,并对选项进行验证和转换
# 定义短选项字符串
short_options = "ho:v"
# 定义长选项字符串
long_options = ["help", "output=", "verbose"]
opts, args = getopt.getopt(argv, short_options, long_options)
args:要解析的参数列表,但不包括当前执行的python脚本名称,一般等同于sys.argv[1:]
shortopts:要识别的短选项字符串
longopts:要识别的长选项列表(不包括--前缀)
-"号后面要紧跟一个选项字母。如果还有此选项的附加参数,可以用空格分开,也可以不分开
"--"号后面要跟一个单词。如果还有些选项的附加参数,后面要紧跟"=",再加上参数。"="号前后不能有空格
示例:"ho:"表示 "h"是一个开关选项,传 -h 即可,或不传, o 后面必须跟一个值,例如 -o 1 ,要么不传。
"ho:"也可以写成"-h-o:","o:h", "-o:-h"
2.getopt.gnu_getopt(args, shortopts, longopts=[]) 默认使用GNU风格的选项解析模式
getopt.gnu_getopt():解析命令行参数,选项和非选项可以混合在一起
函数返回两个列表:opts和args。
opts为分析出的格式信息。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空串''
args为不属于格式信息的剩余的命令行参数。
3.执行程序时,
对于短格式,"-"号后面要紧跟一个选项字母。如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,也可以用引号
对于长格式,"--"号后面要跟一个单词。如果选项有附加参数,
00A.: 后面要紧跟"=",再加上参数,"="号前后不能有空格,
00B.: 或者使用空格分隔选项和附加参数
optparse 模块
optparse: 一个 getopt 的声明式替代物
创建一个 OptionParser 的实例,使用选项来填充它,然后解析命令行。
optparse 允许用户以传统的 GNU/POSIX 语法来指定选项
optparse 模块以更少的代码并附带更清晰的帮助和错误消息生成等价的命令行界面
import optparse
if __name__ == '__main__':
usage = "usage: %prog [options] arg"
parser = optparse.OptionParser(usage)
parser.add_option('-o', '--output')
parser.add_option('-v', dest='verbose', action='store_true')
opts, args = parser.parse_args()
process(args, output=opts.output, verbose=opts.verbose)
1. optparse.OptionParser
2..add_option
01. 每个选项都会有一个短选项字符串和一个长选项字符串 少有一个选项字符串。
02.选项属性: action, type, dest (destination) 和 help
每个选项提供 help 值,并可选项为你的整个程序提供一条简短的用法消息。
显式地设置了 metavar="FILE"
Option.action Option.default Option.type
Option.dest Option.const ption.choices Option.metavar
Option.nargs
默认的 "store" 类动作有 "store", "store_const", "append" 和 "count",
默认的 "typed" 类动作有 "store", "append" 和 "callback"
Option存储参数设置, 构建长选项和短选项列表,并check选项是否合法
03.选项分组
group = OptionGroup(parser, "Dangerous Options",
"Caution: use these options at your own risk. "
"It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)
3.它解析命令行时,optparse 会根据用户提供的命令行值设置 parse_args() 所返回的 options 对象的属性
(options, args) = parser.parse_args()
optparse 必须考虑两种宽泛的错误类:程序员错误和用户错误。
选项: 动作
选项属性是 action,它主要负责确定其他的属性是相关的还是必须的。
如果你传入了不相关的选项属性,或是未能传入必须的属性,
optparse 将引发一个 OptionError 异常来说明你的错误。
class optparse.Values 一个将被解析的参数名和值作为属性保存的对象
标准选项动作有: "store" "store_true" "store_const" "store_false"
"append" "append_const" "count" "callback" "help"
如果你没有提供动作,则默认为 "store"
optparse 有五种内置选项类型: "string", "int", "choice", "float" 和 "complex"
4.应用: 命令行
在命令行中遇到该选项时将得到什么和需要做什么。
5.其他:
当 optparse 的内置动作和类型不能满足你的需要时,你有两个选择:
扩展 optparse 或定义一个回调选项。
例如: 检查选项顺序(通用) 一个选项接受可变数数量的参数时情况
扩展 optparse
添加新的类型 Option.TYPES Option.TYPE_CHECKER
添加新的动作 Option.ACTIONS
异常 无效或不一致的参数 有歧义的选项 相互冲突的选项
argparse 模块来生成大致等价的命令行界面:
argparse: 一个更有针对性的 optparse 替代物,默认提供了更多功能
argparse 模块对命令行界面的支持是围绕 argparse.ArgumentParser
description= 关键字参数
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser( description='A foo that bars',)
parser.add_argument('-o', '--output')
parser.add_argument('-v', dest='verbose', action='store_true')
parser.add_argument('rest', nargs='*')
args = parser.parse_args()
process(args.rest, output=args.output, verbose=args.verbose)
1.argparse.ArgumentParser
2. add_argument() 的调用决定了哪些对象会被创建以及它们如何被赋值
default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
type - 命令行参数应当被转换成的类型
metavar - 在使用方法消息中使用的参数值示例。
dest - 被添加到 parse_args() 所返回对象上的属性名。
action - 当参数在命令行中出现时使用的动作基本类型
'store' - 这用于存储参数的值。 这是默认的动作
'store_const' - 存储由 const 关键字参数指定的值;请注意 const 关键字参数默认为 None。
存储关键字const的值,常用于命令行中不带参数的选项 parser.add_argument('--foo', action='store_const', const=42)
'store_const' 的特例 'store_true' 和 'store_false' - ,分别用于存储 True 和 False 值
store_true 代表着一旦指令里写了这个参数,那么将其值设为True,没有时,默认状态下其值为False。
同理:store_false 代表一旦命令中有此参数,其值则变为False,默认为True。
'append' - 存储一个列表,并将每个参数值添加到该列表
append_const 常用于多个不同选项值需要存储到相同成员列表的情况
'count' - 计算一个关键字参数出现的数目或次数。例如,对于一个增长的详情等级来说有用:
选项名成为了解析结果对象的成员,而选项对应的值则成了成员的值
choices 某些命令行参数应当从一组受限的值中选择。 这可以通过将一个序列对象作为 choices 关键字参数传给
default - 当参数未在命令行中出现时使用的值
## nargs='+'接受1个或多个参数, ## nargs='*'接受零个或多个
# 关键字type指定的是文件类型 float,int
dest - 被添加到 parse_args() 所返回对象上的属性名。关键dest则同时影响解析结果属性名
默认情况下,argparse会根据定义的参数名称来自动生成属性名称。argparse默认的变量名是--或-后面的字符串
例如,定义了一个选项 --foo,那么解析后的结果 命名空间中会有一个 args.foo属性。
使用dest参数,可以自定义这个属性名称。如dest='fooD',则可以使用 args.fooD
metavar - 在使用方法消息中使用的参数值示例,协助-h参数查看描述信息
ArgumentParser.add_subparsers
ArgumentParser.add_argument_group
3.ArgumentParser.parse_args(args=None, namespace=None)
将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间
argparse.Namespace 一个具有可读字符串表示形式的 object
4.应用
01.传list 类型参数
parser.add_argument('--ll', action='append', help='<Required> Set flag', required=True)
python exp.py --ll 1 --ll 2 --ll 3
print(args.ll) ['1','2','3']
或者
parser.add_argument('--list', nargs='+', help='<Required> Set flag', required=True)
python exp.py --list 1 2 3
print(args.ll) ['1','2','3']
02. 限定值
parser.add_argument('--cc', choices=['1','2','3'])
--cc这个命令行参数的取值范围是'1','2'和'3',没有别的 choices内的元素类型,要跟type保持一致
03.add_mutually_exclusive_group()该方法用于创建一个互斥组,在同一命令行中只能选择该组中的一个参数
5. 其他:
Action, overriding the __call__() method and
optionally the __init__() and format_usage() methods.
You can also register custom actions using the register() method and reference them by their registered name.
歧义的选项、无效的类型、无效的选项、错误的位置参数个数等等。
运行脚本时给定环境变量
运行脚本时给定环境变量
action参数:当 sh 命令行(终端)中出现具有 action 属性的参数时,
该参数的值就是‘store_true’所表示的 ture;当 sh 命令行中没有出现具有 action 属性的参数时,该参数的值为‘store_true’所表示的相对值 false
default参数:字面意思,值为true则默认为true,反之亦然。
当两个参数同时出现时,default和action的优先级比较:
1、当action属性的参数未在命令行出现即未触发状态时):default优先级 > action优先级
2、命令行有action属性的参数时(触发状态):action优先级 > default优先级
用于保存一个被定义为参数规范一部分的值,
而不是来自参数解析的值。例如: gcc -w 表示关掉警告信息,-g表示生成调试信息
Linux 命令行参数
Linux
command Options Arguments
命令-选项-参数
选项 被用来提供额外信息以便微调或定制程序的执行
尽量最小化绝对要求用户提供的信息量 --- 只要有可能就使用合理的默认值 过多的选项会让用户更难掌握并使你的代码更难维护。
Linux中,命令选项和参数是用户用于改变和定制命令行命令行行为的重要方式
Options 命令选项 是用来设置命令的行为和功能的,可以通过短横线或双短横线作为前缀来表示。 Options
开关选项:某些选项被称为开关选项,通常不需要提供参数值,只需要加上选项即可实现某种功能
Arguments 命令参数 是提供给命令的具体数值或字符串,用于命令的操作对象或数据
如果选项后面不带参数,则被称之为模式选项。模式选项是可以组合在一起使用的。
例如:如果-a和-l是模式选项,那么-al或-la就都正确
选项参数(Option Arguments)如果选项需要带参数,则称之为参数选项
选项可以有参数,也可以没有参数。参数可以是必需的或可选的
命令行中参数的风格有三大类,
即Unix/Posix、BSD、GNU。分别有以下特征:
Unix/Posix风格,即命令后的参数,可以分组,便必须以连字符开头,如ps -aux。 tar -zxf
BSD风格, 即命令后的参数,可以分组,但不可以与连字符同用。tar zxf
GNU风格, 即长选项,命令后的参数,可以分组,但必须以双横线开头,如:ps --help。
命令或程序后面的参数,由getopt程序处理
历史原因:
Unix风格是从贝尔实验室开发的AT&T Unix系统上原有的命令继承下来的
在缓慢的ASR-33电传打字机上演变而来的,这使得简洁成为一种美德,
因此是单字母选项。按住shift键需要额外的精力,因此偏爱小写,并使用-
可以分开写,也可以合起来写。
GNU 风格的出现是因为仅仅26个字母,
即使算上大小写也只有52个,不够一些复杂的GNU程序使用。
另外一点是相比于单字符的Unix/Posix风格,GNU风格更容易理解,因为出现的不再是缩写的字母
其他:
但除此之外,还有小部分命令的参数风格,不属于上面的任何一种。
比如java -version,像这样命令行,其选项通常以单个连字符-开头,后跟一个单词或字符来表示选项
万事万物都有例外,总有的软件供应商喜欢特立独行
「凡事皆有例外」和「一切皆有可能」
对于任何集合 A,总存在元素 x 不属于 A。对于任意元素 x,总存在集合 A 满足 x 属于 A
C getopt() 函数
表头文件 #include<unistd.h>
定义函数 int getopt(int argc,char * const argv[ ],const char * optstring);
函数说明 getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。
此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。
如果选项字符串里的字母后接着冒号":",则表示还有相关的参数,全域变量optarg 即会指向此额外参数。
如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为""字符,
如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
一个短横线开头 不带关联值的选项能够在一个短横线后合并使用 eg:ls -al 复合选项:命令选项可以一起使用
一个短横线开头 带关联值的选项
如果后接:表示需要给定参数。如abc:,表示识别-a, -b和-c的短选项,其中-c需要后接参数。如果不需要短选项,可以设置为空字符串
长选项-有两个短横线来指明
longopts:要识别的长选项列表(不包括--前缀),长选项如果 后接=表示需要给定参数,不支持可选参数

浙公网安备 33010602011771号