初识
首先建立一个prog.py文件
先从最简单的例子开始,非常简单只有三个语句
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
然后我们做4个实验,分别在命令行里面执行下面4个语句并观察输出 (注意: $ 开头的是 命令行里需要你输入的内容
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
options:
-h, --help show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
总结
1.在不带任何选项的情况下运行脚本,结果不会向命令行显示任何内容。
2.第二个开始显示argparse模块的有用性。我们几乎什么都没做,但是我们已经得到了一个很好的帮助信息。
3.–help选项,也可以缩写为-h,是我们免费得到的唯一选项(也就是说,不需要指定它)。指定任何其他内容都会导致错误。但即便如此,我们还是可以免费获得有用的使用信息。
位置变量
首先看下面的例子,也很简单 不用害怕
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
然后在命令行先来做三次实验
$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
options:
-h, --help show this help message and exit
$ python3 prog.py foo
foo
总结
1.我们调用了add_argument()方法,它用于指定程序愿意接受哪些命令行选项。在本例中,我将其命名为echo
2.现在调用程序需要指定一个选项。比如在终端输入命令的时候需要输入 foo
3.parse_args()方法实际上从指定的选项中返回一些数据,在本例中是echo。
4.该变量是argparse自由执行的某种形式的“魔术”(即不需要指定该值存储在哪个变量中)。您还会注意到,它的名称与方法echo的字符串参数相匹配。( arg.echo = foo)
但是请注意,尽管帮助显示看起来很好,但它目前并没有它可以提供的那么有用。例如,我们看到我们将echo作为一个位置参数,但我们不知道它的作用,只能通过猜测或阅读源代码。所以,让我们让它更有用一点:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here") # 添加说明内容
args = parser.parse_args()
print(args.echo)
然后命令行执行
$ python3 prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here
options:
-h, --help show this help message and exit
接下来我们在做一个实验
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)
执行
$ python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 5, in <module>
print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
结果不太好。这是因为argparse将我们给它的选项作为字符串对待,除非我们告诉它另一个选项。那么,让我们告诉argparse把输入作为一个整数来处理:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
type=int) # 我们添加了一个type 参数
args = parser.parse_args()
print(args.square**2)
然后做两个实验
$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
进行得很顺利。现在,程序在继续之前甚至会很有帮助地退出错误的非法输入。
4 可以从str被转化为int了 ,four 不行就 报错。
可选变量上集
到目前为止,我们一直在讨论位置参数。让我们看看如何添加可选的选项:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
命令行实验
$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
options:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
总结
1 这段程序的编写目的是在指定 --verbose时显示某些内容,而在没有指定时不显示任何内容。
2 为了显示该选项实际上是可选的,在没有它的情况下运行程序不会出现错误。注意,默认情况下,如果一个可选参数没有被使用,那么相关的变量,在第二个实验中args.verbosity,它被赋值为None,这就是它未能通过if语句的真值测试的原因。 所以没有输出
3 帮助信息有点不同。他出现的位置是 options
4 实验室说明 当使 使用–verbose选项时,还必须指定某个值,任何值。
可选变量下集
上面的例子接受任意整数,但对于我们的简单程序来说,只有两个值是真正有用的,True或False。让我们相应地修改代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true") # 这里修改了
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
实验
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
options:
-h, --help show this help message and exit
--verbose increase output verbosity
总结
1 该选项现在更像是一个标志,而不是需要值的东西。我们甚至改变了选项的名称来匹配这个想法。注意,我们现在指定了一个新的关键字action,并给它赋值“store_true”。这意味着,如果指定了该选项,则将值True赋给args.verbose。不指定意味着False。
2.当你指定一个值时,它会报错 因为它不需要赋值
3 注意帮助文本不一样了。
短选项
如果您熟悉命令行用法,您会注意到我还没有涉及选项的简短版本的主题。很简单:
代码
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
命令行实验
$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]
options:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
你们已经可以自己总结出来了把!
结合位置变量和可选变量
我们的程序越来越复杂:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print(f"the square of {args.square} equals {answer}")
else:
print(answer)
实验
$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python3 prog.py 4
16
$ python3 prog.py 4 --verbose
the square of 4 equals 16
$ python3 prog.py --verbose 4
the square of 4 equals 16
忘记了给位置变量赋值 所以报错了
此时注意顺序并不重要。
让可选变量重新可以接受int类型:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
实验
$ python3 prog.py 4
16
$ python3 prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python3 prog.py 4 -v 1
4^2 == 16
$ python3 prog.py 4 -v 2
the square of 4 equals 16
$ python3 prog.py 4 -v 3
16
我们可以限制verbosity 的输入范围
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
实验
$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square
positional arguments:
square display a square of a given number
options:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
关键字 default
关键字还很多 查一下就知道了
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", default=0,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity >= 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
实验
$ python3 prog.py 4
16
到这里 最核心的部分就结束了 其实基本项目里面都是可选变量
浓缩下使用流程就3步
- 创建对象
- 调用方法添加变量 从终端给变量赋值
- 调用方法 返回类似字典的变量