这么多编程语言,用的最多的就是Python,准备写点笔记,整理下文档,提高下自己。
关于 命令行选项解析
,存在一些模块,但一开始的时候我还是自己写一个简单的函数,反正够用就是,但不够优雅。这个 优雅
,就是虽然自己够用,但不好意思给别人用,太粗鄙不堪。
在 Python官网 查看相应的文档: https://docs.python.org/3/search.html?q=option&check_keywords=yes&area=default
我根据自己找到的文档,写一个笔记.
参考: https://docs.python.org/3/using/cmdline.html?highlight=option
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
: 忽略第一行
选项也罢,变量也好,都是CPython里面的一个判断布尔变量,让解释器做出相应的动作而已,基本一个选项会有一个对应的环境变量。
主要的PYTHON环境变量有:
PYTHONHOME
: python安装文件所在路径,如/usr/local/lib/python2.7/PYTHONPATH
: 模块搜索路径PYTHONSTARTUP
: 在python解释器启动的时候先执行的脚本,如定义 sys.ps1
, sys.ps2
等内容PYTHONY2K
: 导致模块 time
只接受4位的年份,而不是2位的,如 98
是无效的,必须是 1998
PYTHONOPTIMIZE
: 等于选项 -O
PYTHONDEBUG
: 等于选项 -d
PYTHONINSPECT
: 等于选项 -i
PYTHONUNBUFFERED
: 等于选项 -u
PYTHONVERBOSE
: 选项 -v
PYTHONCASEOK
: 忽略 import
语句,只在Windows和OS X平台可以使用PYTHONDONTWRITEBYTECODE
: 选项 -B
PYTHONHASHSEED
: 随机分配hash的基数,可以是[0,4294967295],当是0的时候,等于禁止了该选项
参考: 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()
参考: 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.
参考:
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))
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')
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
写笔记,也就是让自己认真点看文档,使用的时候,还是官网的文档详细明了。
作者简介:
朱春来(Leslie Zhu),金融工程师,毕业于西安电子科技大学, 喜欢历史,喜欢编程. 日常在GNU/Linux环境下进行C/C++、Python开发,对Common Lisp、Node.js、金融等感兴趣。可以通过邮箱(pythonisland@gmail.com)联系他,或者直接在他的个人主页上留言.
访问朱春来(Leslie Zhu)的个人主页(http://lesliezhu.github.com)