python模块: argparse——命令行选项和参数解析 笔记

基本流程

# argparse_example.py
import argparse

# 定义解析器
parser = argparse.ArgumentParser(description="Short sample app")
# 添加参数
parser.add_argument('-a', action="store_true", default=False)
parser.add_argument('-b', action="store", dest="b")
parser.add_argument('-c', action="store", dest="c", type=int)
# example with long option names
parser.add_argument('--noarg', action="store_true", default=False)

# parse_args的返回值是一个包含命令参数的Namespace
print(type(parser.parse_args()))
print(parser.parse_args(['-a', "-bval", '-c', '3']))

打开终端到当前py文件目录

> python argparse_short.py

<class 'argparse.Namespace'>
Namespace(a=True, b='val', c=3)

参数动作(action)

遇到一个参数时会触发6个内置动作:

  • store:保存值,可能首先要将值转换成一个不同的类型(可选)。如果没有显式指定动作,这将是默认动作。

  • store_const:保存参数规范中定义的一个值,而不是来自解析参数的一个值,这通常用于实现非bool值的命令行标志。

  • store_true/store_false:保存适当的bool值,这些动作用于实现Boolean语句。

  • append:将值保存到一个列表,如果参数值重复则会保存多个值。

  • append_const:将参数规范中定义的一个值保存到一个列表

  • version:打印程序的版本详细信息,然后退出。

# argparse_action.py
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-s', action="store", 
    dest="simple_value", 
    help="Store a sample value")

parser.add_argument('-c', action='store_const',
    dest='constant_value',
    const='value-to-store',
    help="Store a constant value")

parser.add_argument('-t', action='store_true',
    default=False,
    dest='boolean_t',
    help="Set a switch to true")

parser.add_argument('-f', action='store_false',
    default=True,
    dest='boolean_f',
    help="Set a switch to false")

parser.add_argument('-a', action='append',
    dest='collection',
    default=[],
    help="Add repeated values to a list")

parser.add_argument('-A', action='append_const',
    dest='const_collection',
    const='value-1-to append',
    default=[],
    help="Add different values to list")

parser.add_argument('-B', action='append_const',
    dest='const_collection',
    const='value-2-to-append',
    help='Add different values to list')

parser.add_argument('--version', action='version',
    version='%(prog)s 1.0')

#访问设置的dest变量的方法
results = parser.parse_args()   #1
print('simple_value      ={!r}'.format(results.simple_value)) #2
print('constant_value    ={!r}'.format(results.constant_value))
print('boolean_t         ={!r}'.format(results.boolean_t))
print('boolean_f         ={!r}'.format(results.boolean_f))
print('collection        ={!r}'.format(results.collection))
print('const_collection  ={!r}'.format(results.const_collection))
  • 运行示例
> python argparse_action.py -h

usage: argparse_action.py [-h] [-s SIMPLE_VALUE] [-c] [-t] [-f]
[-a COLLECTION] [-A] [-B] [--version]

optional arguments:
-h, --help show this help message and exit
-s SIMPLE_VALUE Store a sample value
-c Store a constant value
-t Set a switch to true
-f Set a switch to false
-a COLLECTION Add repeated values to a list
-A Add different values to list
-B Add different values to list
--version show program's version number and exit

> python argparse_action.py -s value

simple_value ='value'
constant_value =None
boolean_t =False
boolean_f =True
collection =[]
const_collection =[]

> python argparse_action.py -c

simple_value =None
constant_value ='value-to-store'
boolean_t =False
boolean_f =True
collection =[]
const_collection =[]

> python argparse_action.py -t

simple_value =None
constant_value =None
boolean_t =True
boolean_f =True
collection =[]
const_collection =[]

> python argparse_action.py -f

simple_value =None
constant_value =None
boolean_t =False
boolean_f =False
collection =[]
const_collection =[]

> python argparse_action.py -a one -a two -a three

simple_value =None
constant_value =None
boolean_t =False
boolean_f =True
collection =['one', 'two', 'three']
const_collection =[]

> python argparse_action.py -B -A -B

simple_value =None
constant_value =None
boolean_t =False
boolean_f =True
collection =[]
const_collection =['value-2-to-append', 'value-1-to append', 'value-2-to-append']

读取来自文件的参数

# argparse_fromfile_prefix_chars.txt
-a
-b
2
# argparse_fromfile_prefix_chars.py
import argparse

# 在发现一个有@前缀的参数时会停止,然后读取指定文件来查找更多参数
parser = argparse.ArgumentParser(
    description="Short sample app",
    fromfile_prefix_chars='@'
    )

parser.add_argument('-a', action="store_true", default=False)
parser.add_argument('-b', action="store", dest="b")
parser.add_argument('-c', action="store", dest="c", type=int)

# print(parser.parse_args(['@argparse_fromfile_prefix_chars.txt']))
print(parser.parse_args())
> python argparse_fromfile_prefix_chars.py @argparse_fromfile_prefix_chars.txt

Namespace(a=True, b='2', c=None)

帮助输出

  • 默认状况下使用-h--help参数可获得相关帮助信息

  • 也可在定义解析器时关闭

    parser = argparse.ArgumentParser(add_help=False)
    
  • 定制的帮助显示方式可查阅相关文档

高级参数处理

  1. 可变参数表
含义
N 参数的绝对个数
? 0或1个参数
* 0或所有参数
+ 所有(至少1个)参数

示例代码

# argparse_nargs.py
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--three', nargs=3)
parser.add_argument('--optional', nargs='?')
parser.add_argument('--all', nargs='*', dest='all')
parser.add_argument('--one-or-more', nargs='+')

print(parser.parse_args())

运行示例

> python argparse_nargs.py --three a b c

Namespace(all=None, one_or_more=None, optional=None, three=['a', 'b', 'c'])

> python argparse_nargs.py --optional with_value

Namespace(all=None, one_or_more=None, optional='with_value', three=None)

> python argparse_nargs.py --all with multiple values

Namespace(all=['with', 'multiple', 'values'], one_or_more=None, optional=None, three=None)

python argparse_nargs.py --one-or-more

usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
[--optional [OPTIONAL]] [--all [ALL [ALL ...]]]
[--one-or-more ONE_OR_MORE [ONE_OR_MORE ...]]

  1. 参数类型:argparse将所有参数值都定义为字符串,除非明确要求将字符串转换为另一个类型。add_argument()type参数定义了一个转换器函数(见前面的示例代码)。如果类型转换失败,会产生一个异常。

其它解析方法示例

from sys import argv

script, first, second, third = argv

# argv is a list
print(type(argv))

print(f"The script is called {script}")
print(f"Your first variable is: {first}")
print(f"Your second variable is: {second}")
print(f"Your third variable is: {third}")
> python sys_argv.py 123 456 789

<class 'list'>
The script is called sys_argv.py
Your first variable is: 123
Your second variable is: 456
Your third variable is: 789

注:内容主要来源于《Python3标准库》(Doug Hellmann著),挑选了笔者认为常用的部分

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容