argparse 命令行解析

add_argument action

#action 默认为 store, 把值存下来
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args = parser.parse_args('--foo 1'.split())
print(args.foo)

1
# store_const 选项出现时, 拿到指定值 
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_const', const=42)
args = parser.parse_args(['--foo'])
print(args.foo)
42
# store_true 选项出现时, 拿到True
# store_false 选项出现时,拿到False
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_true')
parser.add_argument('--bar', action='store_false')
parser.add_argument('--baz', action='store_false')
args = parser.parse_args('--foo --bar'.split())
print(args.foo, args.bar, args.baz)
True False True
# append 一个选项多次出现 ,加到一个列表里
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='append')
args = parser.parse_args('--foo 1 --foo hello'.split())
print(args.foo)
['1', 'hello']
# append_const 选项出现时,把指定值放到列表里
parser = argparse.ArgumentParser()
parser.add_argument('--str', dest='types', action='append_const', const='str')
parser.add_argument('--int', dest='types', action='append_const', const='int')
args = parser.parse_args('--str --int'.split())
print(args.types)
['str', 'int']
# count 统计 选项出现的次数 , 如果不设置default=0,默认值是None
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='count', default=0)
args = parser.parse_args(['-vvv', '-v'])
print(args.verbose)
4
# verion 打印版本,并退出 
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--version', action='version', version='%(prog)s 2.0')
parser.parse_args(['--version'])
PROG 2.0



An exception has occurred, use %tb to see the full traceback.


SystemExit: 0



/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3339: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

nargs

# 数字表示收集N个参数 
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs=2)
parser.add_argument('bar', nargs=1)
print(parser.parse_args('c --foo a b'.split()))

# ? 表示收集一个参数,没有使用默认值 
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='?', const='c', default='d')
parser.add_argument('bar', nargs='?', default='d')
print(parser.parse_args(['XX', '--foo', 'YY']))

# * 收集任意多的参数

# + 至少收集一个参数 ,没有报错

# argarse.REMAINDER 剩余的收集起来
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo')
parser.add_argument('command')
parser.add_argument('args', nargs=argparse.REMAINDER)
print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(bar=['c'], foo=['a', 'b'])
Namespace(bar='XX', foo='YY')
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

type

# 默认拿到的是字符串,可通过type指定类型
parser = argparse.ArgumentParser()
parser.add_argument('foo', type=int)
parser.add_argument('bar', type=open)
print(parser.parse_args('2 temp.txt'.split()))

parser = argparse.ArgumentParser()
parser.add_argument('bar', type=argparse.FileType('w'))
print(parser.parse_args(['temp.txt']))
Namespace(bar=<_io.TextIOWrapper name='temp.txt' mode='r' encoding='UTF-8'>, foo=2)
Namespace(bar=<_io.TextIOWrapper name='temp.txt' mode='w' encoding='UTF-8'>)
import math
# type 可以传自定义的函数
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
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('foo', type=perfect_square, help="必须传一个完全平方数")
print(parser.parse_args(['9', '-h']))
# print(parser.parse_args(['7'])) #报错

usage: PROG [-h] foo

positional arguments:
  foo         必须传一个完全平方数

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



An exception has occurred, use %tb to see the full traceback.


SystemExit: 0

choices require help metavar

# choice 用于限制选项的取值范围
parser = argparse.ArgumentParser(prog='game.py')
parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
print(parser.parse_args(['rock']))

print('-' * 50)

# require 选项必须给出
parser = argparse.ArgumentParser()
parser.add_argument('--foo', required=True)

print('-' * 50)

# help 显示帮助信息
parser = argparse.ArgumentParser(prog='frobble')
parser.add_argument('--foo', help="foo的帮助信息")
parser.print_help()

print('-' * 50)

#metavar 帮助信息时,参数位置的代称
parser = argparse.ArgumentParser()
parser.add_argument('--foo', metavar='YYY')
parser.add_argument('bar', metavar='XXX')
parser.parse_args('X --foo Y'.split())
parser.print_help()
Namespace(move='rock')
--------------------------------------------------
--------------------------------------------------
usage: frobble [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo的帮助信息
--------------------------------------------------
usage: ipykernel_launcher.py [-h] [--foo YYY] XXX

positional arguments:
  XXX

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

dest

# dest是解析后选项参数的名字
# ArgumentParser 会通过接受第一个长选项字符串
# 并去掉开头的 -- 字符串来生成 dest 的值。 
# 如果没有提供长选项字符串,则 dest 将通过接受第一个短选项字符串并去掉开头的 - 字符来获得。 
# 任何内部的 - 字符都将被转换为 _ 字符以确保字符串是有效的属性名称。
# 下面的例子显示了这种行为:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo-bar', '--foo')
parser.add_argument('-x', '-y')
print(parser.parse_args('-f 1 -x 2'.split()))


# 自定义 dest名字
parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest='bar')
print(parser.parse_args('--foo XXX'.split()))

Namespace(foo_bar='1', x='2')
Namespace(bar='XXX')
posted @ 2020-06-20 12:37  人不知所  阅读(172)  评论(0)    收藏  举报