Python(1): 命令行选项解析

Python(1): 命令行选项解析

目录

1 前言2 Python解释器2.1 命令行参数说明2.2 PYTHON环境变量3 getopt模块4 optparse模块5 argparse模块5.1 创建对象5.2 选项6 后记

1 前言

这么多编程语言,用的最多的就是Python,准备写点笔记,整理下文档,提高下自己。

关于 命令行选项解析 ,存在一些模块,但一开始的时候我还是自己写一个简单的函数,反正够用就是,但不够优雅。这个 优雅 ,就是虽然自己够用,但不好意思给别人用,太粗鄙不堪。

在 Python官网 查看相应的文档: https://docs.python.org/3/search.html?q=option&check_keywords=yes&area=default

我根据自己找到的文档,写一个笔记.

2 Python解释器

参考: https://docs.python.org/3/using/cmdline.html?highlight=option

2.1 命令行参数说明

CPython解释器的命令行参数说明:

-c command : 执行指定Python语句,里面的语句可以是多条语句-m module-name :以Python本地脚本的形式执行模块,比如 python -m SimpleHTTPServer-b: 当str和bytes进行比较的时候进行 警告 ,选项 -bb 会直接 报错-B: 在import模块的时候不会生成 .pyc, .pyo 文件-d: 激活调试输出-E: 忽略 PYTHON* 环境变量,如 PYTHONPATH, PYTHONHOME-i: 此选项后面不管是直接解析Python脚本或者执行 -c 命令,执行后会直接进入 交互模式 ,从而查看Python的名字空间的内容,方便调试-I: 进入 隔离模式 ,忽略所有的Python环境变量和用户包等-O: 开启优化功能,编译后文件是 .pyo ,而不是 .pyc-OO: 在 -O 优化结果中去掉 文档字符串 信息-q: 不打印版本信息等,等于 静默模式-R: 对Hash进行优化-s: 不使用用户的 site-packages 路径中的模块-S: 初始化的时候不使用模块 site 及其依赖的模块的使用-v: 打印每个模块初始化、搜索等信息,还有 -vv-W arg: 定制警告信息的格式-x: 忽略第一行

2.2 PYTHON环境变量

选项也罢,变量也好,都是CPython里面的一个判断布尔变量,让解释器做出相应的动作而已,基本一个选项会有一个对应的环境变量。

主要的PYTHON环境变量有:

PYTHONHOME: python安装文件所在路径,如/usr/local/lib/python2.7/PYTHONPATH: 模块搜索路径PYTHONSTARTUP: 在python解释器启动的时候先执行的脚本,如定义 sys.ps1, sys.ps2 等内容PYTHONY2K: 导致模块 time 只接受4位的年份,而不是2位的,如 98 是无效的,必须是 1998PYTHONOPTIMIZE: 等于选项 -OPYTHONDEBUG: 等于选项 -dPYTHONINSPECT: 等于选项 -iPYTHONUNBUFFERED: 等于选项 -uPYTHONVERBOSE: 选项 -vPYTHONCASEOK: 忽略 import 语句,只在Windows和OS X平台可以使用PYTHONDONTWRITEBYTECODE: 选项 -BPYTHONHASHSEED: 随机分配hash的基数,可以是[0,4294967295],当是0的时候,等于禁止了该选项

3 getopt模块

参考: https://docs.python.org/3/library/getopt.html?highlight=option

getopt模块是C风格的命令行参数选项解析模块,方便那些对C语言比较熟悉的用户。

该模块主要提供2个函数和一个异常处理:

getopt.getopt(args, shortopts, longopts=[]): 参数args是一个列表,一般是 sys.argv[1:]参数shortopts用一个字符串标记选项,如果选项有参数值,则增加 :参数longopts是可选的,是一个列表,包含了所有 -- 长选项的名字getopt.gnu_getopt(args, shortopts, longopts=[]): 基本和getopt一样,只是扫描风格是GNU风格exception getopt.GetoptError: 当解析错误就触发exception getopt.error: 等同于GetoptError

举例1:

>>> import getopt>>> args = '-a -b -cfoo -d bar a1 a2'.split()>>> args['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']>>> optlist, args = getopt.getopt(args, 'abc:d:')>>> optlist[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]>>> args['a1', 'a2']

举例2:

>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'>>> args = s.split()>>> args['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']>>> optlist, args = getopt.getopt(args, 'x', [...     'condition=', 'output-file=', 'testing'])>>> optlist[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]>>> args['a1', 'a2']

举例3:

import getopt, sysdef main():    try:        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])    except getopt.GetoptError as err:        # print help information and exit:        print(err) # will print something like "option -a not recognized"        usage()        sys.exit(2)    output = None    verbose = False    for o, a in opts:        if o == "-v":            verbose = True        elif o in ("-h", "--help"):            usage()            sys.exit()        elif o in ("-o", "--output"):            output = a        else:            assert False, "unhandled option"    # ...if __name__ == "__main__":    main()
4 optparse模块

参考: https://docs.python.org/3/library/optparse.html?highlight=option

这个模块将不会继续开发,如果可以,尽量使用 argparse模块 :

Deprecated since version 3.2: The optparse module is deprecated and will not be developed further; development will continue with the argparse module.
5 argparse模块

参考:

https://docs.python.org/3/howto/argparse.html?highlight=optionhttps://docs.python.org/3/library/argparse.html?highlight=option

argparse模块可以用很少的代码而获取强大的命令行选项解析功能,简单易用.

举例1:

import argparseparser = argparse.ArgumentParser(description='Process some integers.')parser.add_argument('integers', metavar='N', type=int, nargs='+',                   help='an integer for the accumulator')parser.add_argument('--sum', dest='accumulate', action='store_const',                   const=sum, default=max,                   help='sum the integers (default: find the max)')args = parser.parse_args()print(args.accumulate(args.integers))
5.1 创建对象

argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=, []formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)

prog: 默认是sys.argv[ 0 ],即程序名usage: 默认是根据参数自动生成description: 对程序的描述信息,在help选项信息之前打印epilog: 对程序的补充信息,在help选项信息之后打印parents=list(): 继承一个父argparse对象的属性,作为一个列表元素提供conflict_handler: 解决选项冲突问题add_help: 增加-h/–help选项,默认开启

举例:

>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')>>> parent_parser = argparse.ArgumentParser(add_help=False)>>> parent_parser.add_argument('--parent', type=int)>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')>>> parser.add_argument('-f', '--foo', help='old foo help')>>> parser.add_argument('--foo', help='new foo help')
5.2 选项

add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

name: 就是选项名称action:store: 保存选项值store_const: 保存的值由const决定store_true,store_false:包含选择,则返回True或者Falseappend:将值追加到一个列表,方便重复使用选项的情况append_constcount:记录选择的次数version:取决于version关键字

举例1;

>>> parser.add_argument('--foo', action='store_const', const=42)>>> parser.add_argument('--foo', action='store_true')>>> parser.add_argument('--foo', action='append')>>> parser.add_argument('--int', dest='types', action='append_const', const=int)>>> parser.add_argument('--verbose', '-v', action='count')>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')

举例2:

import argparseparser = argparse.ArgumentParser(description="calculate X to the power of Y")group = parser.add_mutually_exclusive_group()group.add_argument("-v", "--verbose", action="store_true")group.add_argument("-q", "--quiet", action="store_true")parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")args = parser.parse_args()answer = args.x**args.yif args.quiet:    print(answer)elif args.verbose:    print("{} to the power {} equals {}".format(args.x, args.y, answer))else:    print("{}^{} == {}".format(args.x, args.y, answer))$ python3 prog.py --helpusage: prog.py [-h] [-v | -q] x ycalculate X to the power of Ypositional arguments:  x              the base  y              the exponentoptional arguments:  -h, --help     show this help message and exit  -v, --verbose  -q, --quiet
6 后记

写笔记,也就是让自己认真点看文档,使用的时候,还是官网的文档详细明了。


作者简介:

朱春来(Leslie Zhu),金融工程师,毕业于西安电子科技大学, 喜欢历史,喜欢编程. 日常在GNU/Linux环境下进行C/C++、Python开发,对Common Lisp、Node.js、金融等感兴趣。可以通过邮箱(pythonisland@gmail.com)联系他,或者直接在他的个人主页上留言.

访问朱春来(Leslie Zhu)的个人主页(http://lesliezhu.github.com)

Python(1): 命令行选项解析

相关文章:

你感兴趣的文章:

标签云: