16.4. argparse

argparse模块可以轻松编写用户友好的命令行界面。 该程序定义了它需要的参数,argparse将找出如何解析 sys.argv中的那些参数。 argparse模块还会自动生成帮助和用法消息,并在用户给出程序无效参数时发出错误。

16.4.1. 快速入门样例

代码:

import argparse

parser = 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))

调用样例

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 00-入门.py  -h
usage: 00-入门.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
N           an integer for the accumulator

optional arguments:
-h, --help  show this help message and exit
--sum       sum the integers (default: find the max)

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 00-入门.py  1 2 3 4
4

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 00-入门.py  --sum 1 2 3 4
10

16.4.2. ArgumentParser 对象

class 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, allow_abbrev=True)

prog

程序名字,默认是sys.argv[0]

usage

程序的使用,自动生成的

description

描述信息(参数前面)

epilog

描述信息(参数后面)

formatter_class

自定义的帮助信息生成类

prefix_chars

选项前缀,默认是“-”

fromfile_prefix_chars

应该读取附加参数的文件前缀的字符集

conflict_handler

解析冲突选项的

add_help

是否添加-h,–help选项去获取帮助,默认是True

allow_abbrev

如果缩写是明确的,允许长选项被缩写。,默认是True

16.4.2.1. prog

功能: 设置程序的名字,默认程序名字是sys.argv[0]。

样例代码

import argparse
parser = argparse.ArgumentParser(prog="mytest")
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 01-prog.py  -h
usage: mytest [-h] [--foo FOO]

optional arguments:
-h, --help  show this help message and exit
--foo FOO   foo help

可以看出来我们修改prog之后,usage提示信息就会显示我们修改的,默认是sys.argv[0]的值。

16.4.2.2. usage

功能: 获取或者程序的usage信息,不建议修改,这个程序会自动生成。

样例代码

import argparse

parser = argparse.ArgumentParser(prog="mytest2")

parser.add_argument('--src',help='%(prog) 的源地址')
parser.add_argument('-t' ,help="指定类型")
parser.print_usage()
print("="*40)

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 02-usage.py
usage: mytest2 [-h] [--src SRC] [-t T]
========================================

usage信息默认就是横线上面的那一行内容,我们可以自己自定义这个。

16.4.2.3. description

功能: 在usage和具体参数的中间显示这个信息,用于解释这个命令的功能

样例代码

import argparse

parser = argparse.ArgumentParser(description="啥也不做")

parser.print_usage()
print("="*40)
parser.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 04-description.py
usage: 04-description.py [-h]
========================================
usage: 04-description.py [-h]

啥也不做

optional arguments:
-h, --help  show this help message and exit

16.4.2.4. epilog

功能: 在帮助信息的最下面提示信息。

样例代码

import argparse 

parser = argparse.ArgumentParser(description=u"测试下epilog",epilog=u"这个已经过期了,建议改用ip命令")

parser.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 05-epilog.py
usage: 05-epilog.py [-h]

测试下epilog

optional arguments:
-h, --help  show this help message and exit

这个已经过期了,建议改用ip命令

16.4.2.5. parents

功能: 设置解析的父亲。

样例代码

import argparse

parent_parser= argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('--count',type=int )

child1_parser= argparse.ArgumentParser(parents=[parent_parser])

child1_parser.add_argument("--test1")

child2_parser= argparse.ArgumentParser(parents=[parent_parser])

child2_parser.add_argument("--test2")

print("parent的使用帮助\n")
parent_parser.print_help()

print("child1的使用帮助\n")
child1_parser.print_help()

print("child2的使用帮助\n")
child2_parser.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 06-parents.py
parent的使用帮助

usage: 06-parents.py [--count COUNT]

optional arguments:
--count COUNT
child1的使用帮助

usage: 06-parents.py [-h] [--count COUNT] [--test1 TEST1]

optional arguments:
-h, --help     show this help message and exit
--count COUNT
--test1 TEST1
child2的使用帮助

usage: 06-parents.py [-h] [--count COUNT] [--test2 TEST2]

optional arguments:
-h, --help     show this help message and exit
--count COUNT
--test2 TEST2

16.4.2.6. formatter_class

功能: 设置解析帮助信息的类

样例代码

import argparse

parser =  argparse.ArgumentParser(
    prog="test",
    description="测试formatter_class",
    epilog="这里是epilog信息",
    formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )

parser.add_argument('--foo', type=int, default=42, help='FOO!')
parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')

print("\n默认(argparse.ArgumentDefaultsHelpFormatter)的格式化输出\n")
parser.print_help()

parser.formatter_class=argparse.RawDescriptionHelpFormatter
print("\n(argparse.RawDescriptionHelpFormatter¶)的格式化输出\n")
parser.print_help()

parser.formatter_class=argparse.RawTextHelpFormatter
print("\n(argparse.RawTextHelpFormatter)的格式化输出\n")
parser.print_help()


终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 07-formatter_class.py

默认(argparse.ArgumentDefaultsHelpFormatter)的格式化输出

usage: test [-h] [--foo FOO] [bar [bar ...]]

测试formatter_class

positional arguments:
bar         BAR! (default: [1, 2, 3])

optional arguments:
-h, --help  show this help message and exit
--foo FOO   FOO! (default: 42)

这里是epilog信息

(argparse.RawDescriptionHelpFormatter¶)的格式化输出

usage: test [-h] [--foo FOO] [bar [bar ...]]

测试formatter_class

positional arguments:
bar         BAR!

optional arguments:
-h, --help  show this help message and exit
--foo FOO   FOO!

这里是epilog信息

(argparse.RawTextHelpFormatter)的格式化输出

usage: test [-h] [--foo FOO] [bar [bar ...]]

测试formatter_class

positional arguments:
bar         BAR!

optional arguments:
-h, --help  show this help message and exit
--foo FOO   FOO!

这里是epilog信息

上面的实验, 暂时没有看到这几种导出的区别的。

官方给出的说明:

  • RawTextHelpFormatter为各种帮助文本保留空白,包括参数描述。 但是,多个新行被替换为一个。 如果您希望保留多个空行,请在换行符之间添加空格。

  • ArgumentDefaultsHelpFormatter会自动为每个参数帮助消息添加有关默认值的信息:

  • MetavarTypeHelpFormatter为每个参数使用类型参数的名称作为其值的显示名称(而不是像常规格式化程序那样使用dest)

16.4.2.7. prefix_char

功能: 设置参数的前缀字符

样例代码

import argparse

parser = argparse.ArgumentParser(prefix_chars='-+')

parser.add_argument('+f')
parser.add_argument('++bar')

parser.parse_args('+f X ++bar Y'.split())

parser.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 08-prefix_char.py /f
usage: 08-prefix_char.py [-h] [+f F] [++bar BAR]

optional arguments:
-h, --help  show this help message and exit
+f F
++bar BAR

linux环境的命令基本都是“-”作为前缀的,这也是prefix_char的默认值,window命令基本都是”/” 。

16.4.2.8. fromfile_prefix_chars

功能: 从文件读取参数的前缀

样例代码

import argparse

with open('args.txt', 'w') as fp:
    fp.write('-f\nbar')

parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('-f')

print(parser.parse_args(['-f', 'foo']))
print(parser.parse_args(['-f', 'foo', '@args.txt']))

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 09-fromfile_prefix_chars.py
Namespace(f='foo')
Namespace(f='bar')

可以看出来,文件中指定值覆盖了前面的值。 后面的会覆盖前面的值。

16.4.2.9. default

功能: 设置默认值

样例代码

import argparse

parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
parser.add_argument('--foo')
parser.add_argument('bar', nargs='?')
print(parser.parse_args(['--foo', '1', 'BAR']))
print(parser.parse_args([]))


parser2 = argparse.ArgumentParser()
parser2.add_argument('--foo')
parser2.add_argument('bar', nargs='?')
print(parser2.parse_args(['--foo', '1', 'BAR']))
print(parser2.parse_args([]))

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 10-default.py
Namespace(bar='BAR', foo='1')
Namespace()
Namespace(bar='BAR', foo='1')
Namespace(bar=None, foo=None)

这个可以看出来,默认即使这个选项没有指定也会创建出来这个属性,但是我们指定下为argument_default=argparse.SUPPRESS就不会创建属性了

16.4.2.10. allow_abbrev

功能: 这个就是长选项的简写开启不开启的问题了。

样例代码

import argparse

parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=True)
parser.add_argument('--foobar', action='store_true')
parser.add_argument('--foonley', action='store_false')

print("\n允许简写的\n")
print(parser.parse_args(['--foon']))

print("\n不允许简写的\n")
parser.allow_abbrev=False
print(parser.parse_args(['--foon']))

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 11-allow_abbrev.py

允许简写的

Namespace(foobar=False, foonley=False)

不允许简写的

usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon

16.4.2.11. conflict_handler

功能: 这个就是长选项的简写开启不开启的问题了。

样例代码

import argparse

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')

print("解决冲突的方式结果")
parser.print_help()

print("默认的结果")
parser2 = argparse.ArgumentParser(prog='PROG')
parser2.add_argument('-f', '--foo', help='old foo help')
parser2.add_argument('--foo', help='new foo help')

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 12-conflict_handler.py
解决冲突的方式结果
usage: PROG [-h] [-f FOO] [--foo FOO]

optional arguments:
-h, --help  show this help message and exit
-f FOO      old foo help
--foo FOO   new foo help
默认的结果
Traceback (most recent call last):
File "12-conflict_handler.py", line 13, in <module>
    parser2.add_argument('--foo', help='new foo help')
File "D:\Users\Administrator\Anaconda3\lib\argparse.py", line 1348, in add_argument
    return self._add_action(action)
File "D:\Users\Administrator\Anaconda3\lib\argparse.py", line 1711, in _add_action
    self._optionals._add_action(action)
File "D:\Users\Administrator\Anaconda3\lib\argparse.py", line 1552, in _add_action
    action = super(_ArgumentGroup, self)._add_action(action)
File "D:\Users\Administrator\Anaconda3\lib\argparse.py", line 1362, in _add_action
    self._check_conflict(action)
File "D:\Users\Administrator\Anaconda3\lib\argparse.py", line 1501, in _check_conflict
    conflict_handler(action, confl_optionals)
File "D:\Users\Administrator\Anaconda3\lib\argparse.py", line 1510, in _handle_conflict_error
    raise ArgumentError(action, message % conflict_string)
argparse.ArgumentError: argument --foo: conflicting option string: --foo

16.4.2.12. add_help

功能: 这个就是长选项的简写开启不开启的问题了。

样例代码

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
print("\n有帮助的输出结果\n")
parser.print_help()

parser2 = argparse.ArgumentParser(add_help=False)
parser2.add_argument('--foo', help='foo help')
print("\n没有帮助的输出结果\n")
parser2.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例 (master)
$ python 13-add_help.py

有帮助的输出结果

usage: 13-add_help.py [-h] [--foo FOO]

optional arguments:
-h, --help  show this help message and exit
--foo FOO   foo help

没有帮助的输出结果

usage: 13-add_help.py [--foo FOO]

optional arguments:
--foo FOO  foo help

可以看出来,没有了-h,–help这些选项了,不建议设置这个选项,保持默认值就可以了。

16.4.3. add_argument() 方法

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

name

指定名字

action

在命令行中遇到此参数时要采取的基本操作类型

nargs

应该使用的命令行参数的数量

const

一些动作和nargs选择所需的常量值

default

如果参数在命令行中不存在,则生成的值

type

命令行参数应该转换的类型

choices

一个允许参数值的容器

required

是否可以省略命令行选项(仅限可选项)

help

对参数做了什么的简要描述。

metavar

用法消息中参数的名称。

dest

要添加到由parse_args()返回的对象的属性的名称。

16.4.3.1. name

功能: 设置选项名字的

样例代码

import argparse

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-f', '--foo')
parser.add_argument('bar')
result = parser.parse_args(['BAR', '--foo', 'FOO'])
print(result)

print(result.bar)

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 01-name.py
Namespace(bar='BAR', foo='FOO')
BAR

16.4.3.2. action

功能: 设置选项名字的

样例代码

import argparse

def print_line(content):
    print(content.center(80,"#"))

# 测试默认值(store)
print_line("测试默认值(store)")
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
print(parser.parse_args('--foo 1'.split()))
#Namespace(foo='1')

# 测试值(store_const)
print_line("测试值(store_const)")
parser2 = argparse.ArgumentParser()
parser2.add_argument('--foo', action='store_const', const=42)
print(parser2.parse_args(['--foo']))
#Namespace(foo=42)

# 测试值(store_true,store_false)
print_line("测试值(store_const)")
parser3 = argparse.ArgumentParser()
parser3.add_argument('--foo', action='store_true')
parser3.add_argument('--bar', action='store_false')
parser3.add_argument('--baz', action='store_false')
# 指定strore_true后,如果指定了这个选项后,那么结果就是true,没有指定就是false。
print(parser3.parse_args('--foo --bar'.split()))
#Namespace(bar=False, baz=True, foo=True)

# 测试值(append)
print_line("测试值(append)")
parser4 = argparse.ArgumentParser()
parser4.add_argument('--foo', action='append')
print(parser4.parse_args('--foo 1 --foo 2'.split()))
#Namespace(foo=['1', '2'])

# 测试值(append_const)
print_line("测试值(append_const)")
parser5 = argparse.ArgumentParser()
parser5.add_argument('--str', dest='types', action='append_const', const=str)
parser5.add_argument('--int', dest='types', action='append_const', const=int)
print(parser5.parse_args('--str --int'.split()))
#Namespace(types=[<class 'str'>, <class 'int'>])

# 测试值(count)
print_line("测试值(count)")
parser6 = argparse.ArgumentParser()
parser6.add_argument('--verbose', '-v', action='count')
print(parser6.parse_args(['-vvv']))
#Namespace(verbose=3)


# 测试值(version)
print_line("测试值(version)")
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--version', action='version', version='%(prog)s 2.0')
print(parser.parse_args(['--version']))
#PROG 2.0




终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 02-action.py
##################################测试默认值(store)##################################
Namespace(foo='1')
################################测试值(store_const)################################
Namespace(foo=42)
################################测试值(store_const)################################
Namespace(bar=False, baz=True, foo=True)
##################################测试值(append)###################################
Namespace(foo=['1', '2'])
###############################测试值(append_const)################################
Namespace(types=[<class 'str'>, <class 'int'>])
###################################测试值(count)###################################
Namespace(verbose=3)
##################################测试值(version)##################################
PROG 2.0

16.4.3.3. nargs

功能: 设置指定选项使用的参数个数,按照正则的去理解它。

  • N 使用特定个数

  • ? 使用0个或者1个

  • + 使用1个或者多个

  • * 使用任意个

  • argparse.REMAINDER 剩余的所有

样例代码

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs=2)
parser.add_argument('bar', nargs=1)
print(parser.parse_args('c --foo a b'.split()))
#Namespace(bar=['c'], foo=['a', 'b'])

parser2 = argparse.ArgumentParser()
parser2.add_argument('--foo', nargs='?', const='c', default='d')
parser2.add_argument('bar', nargs='?', default='d')
print(parser2.parse_args(['XX', '--foo', 'YY']))
#Namespace(bar='XX', foo='YY')
print(parser2.parse_args(['XX', '--foo']))
#Namespace(bar='XX', foo='c')
print(parser2.parse_args([]))
#Namespace(bar='d', foo='d')


parser3 = argparse.ArgumentParser()
parser3.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
parser3.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
print(parser3.parse_args(['input.txt', 'output.txt']))
#Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)
print(parser3.parse_args([]))
#Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)

parser4 = argparse.ArgumentParser()
parser4.add_argument('--foo', nargs='*')
parser4.add_argument('--bar', nargs='*')
parser4.add_argument('baz', nargs='*')
print(parser4.parse_args('a b --foo x y --bar 1 2'.split()))
#Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])

parser5 = argparse.ArgumentParser(prog='PROG')
parser5.add_argument('foo', nargs='+')
print(parser5.parse_args(['a', 'b']))
#Namespace(foo=['a', 'b'])
parser5.parse_args([])
#usage: PROG [-h] foo [foo ...]
#PROG: error: too few arguments

parser6 = argparse.ArgumentParser(prog='PROG')
parser6.add_argument('--foo')
parser6.add_argument('command')
parser6.add_argument('args', nargs=argparse.REMAINDER)
print(parser6.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
#Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 03-nargs.py
Namespace(bar=['c'], foo=['a', 'b'])
Namespace(bar='XX', foo='YY')
Namespace(bar='XX', foo='c')
Namespace(bar='d', foo='d')
Namespace(infile=<_io.TextIOWrapper name='input.txt' mode='r' encoding='cp936'>, outfile=<_io.TextIOWrapper name='output.txt' mode='w' encoding='cp936'>)
Namespace(infile=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>, outfile=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
Namespace(foo=['a', 'b'])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo

16.4.3.4. const

功能: 常量

使用参考上面的action即可。

16.4.3.5. default

功能: 设置默认值的,如果没有指定的话,

样例代码

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--length', default='10', type=int)
parser.add_argument('--width', default=10.5, type=int)
print(parser.parse_args())
#Namespace(length=10, width=10.5)

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 04-default.py
Namespace(length=10, width=10.5)

16.4.3.6. type

功能: 指定选项值的类型,默认是string的。

样例代码

import argparse
import math

parser = argparse.ArgumentParser()
parser.add_argument('foo', type=int)
parser.add_argument('bar', type=open)
print(parser.parse_args('2 temp.txt'.split()))
#Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)


parser2 = argparse.ArgumentParser()
parser2.add_argument('bar', type=argparse.FileType('w'))
print(parser2.parse_args(['out.txt']))
#Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>)


def perfect_square(string):
    value = int(string)
    sqrt = math.sqrt(value)
    if sqrt != int(sqrt):
        msg = "%r is not a perfect square" % string
        raise argparse.ArgumentTypeError(msg)
    return value

parser3 = argparse.ArgumentParser(prog='PROG')
parser3.add_argument('foo', type=perfect_square)
print(parser3.parse_args(['9']))
#Namespace(foo=9)
print(parser3.parse_args(['7']))
#usage: PROG [-h] foo
#PROG: error: argument foo: '7' is not a perfect square

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 05-type.py
Namespace(bar=<_io.TextIOWrapper name='temp.txt' mode='r' encoding='cp936'>, foo=2)
Namespace(bar=<_io.TextIOWrapper name='out.txt' mode='w' encoding='cp936'>)
Namespace(foo=9)
usage: PROG [-h] foo
PROG: error: argument foo: '7' is not a perfect square

16.4.3.7. choices

功能: 提供可选值

样例代码

import argparse

parser = argparse.ArgumentParser(prog='game.py')
parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
print(parser.parse_args(['rock']))
#Namespace(move='rock')
print(parser.parse_args(['fire']))
#usage: game.py [-h] {rock,paper,scissors}
#game.py: error: argument move: invalid choice: 'fire' (choose from 'rock','paper', 'scissors')

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 06-choices.py
Namespace(move='rock')
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock', 'paper', 'scissors')

16.4.3.8. required

功能: 强制性设置

样例代码

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', required=True)
print(parser.parse_args(['--foo', 'BAR']))
#Namespace(foo='BAR')
print(parser.parse_args([]))
#usage: argparse.py [-h] [--foo FOO]
#argparse.py: error: option --foo is required

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 07-required.py
Namespace(foo='BAR')
usage: 07-required.py [-h] --foo FOO
07-required.py: error: the following arguments are required: --foo

16.4.3.9. help

功能: 提供帮助信息

样例代码

import argparse

parser = argparse.ArgumentParser(prog='frobble')
parser.add_argument('bar', nargs='?', type=int, default=42, help='the bar to %(prog)s (default: %(default)s)')
parser.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 08-help.py
usage: frobble [-h] [bar]

positional arguments:
bar         the bar to frobble (default: 42)

optional arguments:
-h, --help  show this help message and exit

16.4.3.10. metavar

功能: 提供元数据信息

样例代码

import argparse

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=4, metavar=('east', 'west','south','north'))
print(parser.print_help())

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 09-metavar.py
usage: PROG [-h] [-x X X] [--foo east west south north]

optional arguments:
-h, --help            show this help message and exit
-x X X
--foo east west south north
None

Note

这个参数在特定选项有多个参数的时候,可以使用下会让帮助信息更清楚。

16.4.3.11. dest

功能: 设置特定选项的创建的属性名字

样例代码

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest='bar')
print(parser.parse_args('--foo XXX'.split()))
#Namespace(bar='XXX')
parser2 = argparse.ArgumentParser()
parser2.add_argument('--foo')
print(parser2.parse_args('--foo XXX'.split()))
#Namespace(foo='XXX')

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 10-dest.py
Namespace(bar='XXX')
Namespace(foo='XXX')

16.4.4. parse_args() 方法

ArgumentParser.parse_args(args=None, namespace=None)

功能: 解析参数列表

样例代码

import argparse

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x')
parser.add_argument('--foo')
print(parser.parse_args(['-x', 'X']))
#Namespace(foo=None, x='X')
print(parser.parse_args(['--foo', 'FOO']))
#Namespace(foo='FOO', x=None)

print(parser.parse_args(['--foo=FOO']))
#Namespace(foo='FOO', x=None)

parser2 = argparse.ArgumentParser(prog='PROG')
parser2.add_argument('-x', action='store_true')
parser2.add_argument('-y', action='store_true')
parser2.add_argument('-z')
print(parser2.parse_args(['-xyzZ']))
#Namespace(x=True, y=True, z='Z')


parser3 = argparse.ArgumentParser()
parser3.add_argument('--foo')
args = parser3.parse_args(['--foo', 'BAR'])
print(vars(args))
#{'foo': 'BAR'}


class C:
    pass

c = C()
parser4 = argparse.ArgumentParser()
parser4.add_argument('--foo')
parser4.parse_args(args=['--foo', 'BAR'], namespace=c)
#print(c.foo)
#'BAR'

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/方法的 (master)
$ python 11-parse_args.py
Namespace(foo=None, x='X')
Namespace(foo='FOO', x=None)
Namespace(foo='FOO', x=None)
Namespace(x=True, y=True, z='Z')
{'foo': 'BAR'}
BAR

16.4.5. 其他功能

16.4.5.1. 子命令

ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action] [, option_string][, dest][, help][, metavar])

title

标题

description

描述

prog

程序名字

parser_class

解析类

action

动作

dest

属性名字

help

帮助信息

metavar

元数据信息

功能: 解析参数列表

样例代码

import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', action='store_true', help='foo help')

subparsers = parser.add_subparsers(help='sub-command help')

parser_a = subparsers.add_parser('a', help='a help')
parser_a.add_argument('bar', type=int, help='bar help')


# 可以使用别名去简化子命令的编写
parser_b = subparsers.add_parser('checkout', help='b help',aliases=["co"])
parser_b.add_argument('--baz', choices='XYZ', help='baz help')


print(parser.parse_args(['a', '12']))
#Namespace(bar=12, foo=False)
print(parser.parse_args(['--foo', 'checkout', '--baz', 'Z']))
#Namespace(baz='Z', foo=True)
print(parser.parse_args(['--foo', 'co', '--baz', 'Z']))
#Namespace(baz='Z', foo=True)

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/其他的 (master)
$ python 01-子命令.py
Namespace(bar=12, foo=False)
Namespace(baz='Z', foo=True)
Namespace(baz='Z', foo=True)

16.4.5.2. 参数组

ArgumentParser.add_argument_group(title=None, description=None)

功能: 添加参数组,有些命令会有多种使用方式。

样例代码

import argparse

parser = argparse.ArgumentParser(prog='PROG', add_help=False)
group1 = parser.add_argument_group('group1', 'group1 description')
group1.add_argument('foo', help='foo help')
group2 = parser.add_argument_group('group2', 'group2 description')
group2.add_argument('--bar', help='bar help')
parser.print_help()

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/其他的 (master)
$ python 02-group.py
usage: PROG [--bar BAR] foo

group1:
group1 description

foo        foo help

group2:
group2 description

--bar BAR  bar help

16.4.5.3. 强制组

ArgumentParser.add_mutually_exclusive_group(required=False)

功能: 添加参数组,这个组在使用命令的时候必须指定

样例代码

import argparse

parser = argparse.ArgumentParser(prog='PROG')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')
parser.parse_args([])

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/其他的 (master)
$ python 03-mutually_group.py
usage: PROG [-h] (--foo | --bar)
PROG: error: one of the arguments --foo --bar is required

16.4.5.4. 设置默认值

ArgumentParser.set_defaults(**kwargs)

功能: 添加参数组,这个组在使用命令的时候必须指定

样例代码maek

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('foo', type=int)
parser.set_defaults(bar=42, baz='badger')
print(parser.get_default('bar'))
print(parser.parse_args(['736']))

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/其他的 (master)
$ python 04-set_default.py
42
Namespace(bar=42, baz='badger', foo=736)

16.4.6. 案例

16.4.6.1. 案例1

要求: 写一个类似编译的源码的解析脚本,提供make clean,make ,make install等调用。

样例代码

import argparse
import time

parser = None

def make(): 
    print("start make ")
    time.sleep(2)
    print("end make")

def make_install(): 
    print("start make install ")
    time.sleep(2)
    print("end make install")

def make_clean():
    print("start make clean")
    time.sleep(2)
    print("end make clean")


parser = argparse.ArgumentParser(description='模拟编译操作')
parser.add_argument('do',type=str,nargs='?' ,help='设置需要做的操作',choices=['install','clean'])

result = parser.parse_args()
#print(result)

# 开始根据参数进行判定

if result.do == None: 
    make()
elif result.do == "install":
    make_install()
elif result.do == "clean":
    make_clean()
else:
    pass

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py  --help
usage: make.py [-h] [{install,clean}]

模拟编译操作

positional arguments:
{install,clean}  设置需要做的操作

optional arguments:
-h, --help       show this help message and exit

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py
start make
end make

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py install
start make install
end make install

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py clean
start make clean
end make clean

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py test
usage: make.py [-h] [{install,clean}]
make.py: error: argument do: invalid choice: 'test' (choose from 'install', 'clean')

16.4.6.2. 案例2

要求: 写一个简单版本的防火墙命令实现

在写之前,需要熟悉下 iptables 的使用。

分析:

这个相对比较复杂

样例代码

import argparse
import time

parser = None

def make(): 
    print("start make ")
    time.sleep(2)
    print("end make")

def make_install(): 
    print("start make install ")
    time.sleep(2)
    print("end make install")

def make_clean():
    print("start make clean")
    time.sleep(2)
    print("end make clean")


parser = argparse.ArgumentParser(description='模拟编译操作')
parser.add_argument('do',type=str,nargs='?' ,help='设置需要做的操作',choices=['install','clean'])

result = parser.parse_args()
#print(result)

# 开始根据参数进行判定

if result.do == None: 
    make()
elif result.do == "install":
    make_install()
elif result.do == "clean":
    make_clean()
else:
    pass

终端测试

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py  --help
usage: make.py [-h] [{install,clean}]

模拟编译操作

positional arguments:
{install,clean}  设置需要做的操作

optional arguments:
-h, --help       show this help message and exit

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py
start make
end make

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py install
start make install
end make install

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py clean
start make clean
end make clean

Administrator@DESKTOP-31DI5AI MINGW64 /e/ZhaojiediProject/github/My_Study_Python/source/样例/argparse样例/案例的 (master)
$ python make.py test
usage: make.py [-h] [{install,clean}]
make.py: error: argument do: invalid choice: 'test' (choose from 'install', 'clean')