0-概念
通俗来说,命令行与参数解析就是当你输入cmd 打开dos 交互界面时候,启动程序要进行的参数给定。比如在dos 界面输入:
python openPythonFile.py "a" -b "number"
其中的"a", -b 等就是命令行与参数解析要做的事。
1-基础
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
测试
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
optional arguments:
-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
以下是发生的事情:在没有任何选项的情况下运行脚本会导致没有显示到stdout。不太有用。
第二个开始显示
该--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
optional arguments:
-h, --help show this help message and exit
$ python3 prog.py foo
foo
这是正在发生的事情:我们添加了add_argument()方法,这是我们用来指定程序愿意接受的命令行选项的方法。在这种情况下,我将其命名为echo符合其功能。
现在调用我们的程序需要我们指定一个选项。
该parse_args()方法实际上返回了指定选项中的一些数据,在本例中echo。
变量是某种形式的“魔法”,echo。
但请注意,虽然帮助显示看起来很好,但它目前并没有那么有用。例如,我们看到我们得到了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
optional arguments:
-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
print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
这是因为
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
type=int)
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'
该程序现在甚至可以帮助检测出错误的非法输入。
介绍可选参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
输出
$ python prog.py --verbosity 1
verbosity turned on
$ python prog.py
$ python prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
下面是程序运行产生的结果:当我们在命令行中列出了–verbosity时,程序才会给我们显示所需要的信息,而如果我们不列出–verbosity则什么都不会显示。
显示这个选项是可选择的,即使我们不添加也不会有任何的错误,注意,默认的时候argparse.verbosity是不会赋任何值的,所以上面的程序中if语句出现了错误
当使用–verbosity时,我们必须给它一个值
–verbosity能接受任意的整数值,但是为了简化程序,我们希望只有true和false两个bool型的变量能够被使用,让我们相应修改我们的程序:
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"
输出:
$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosi
分析:比起之前需要一个Value,现在的做法更像一个标志选项,我们甚至为了实现这中想法修改了选项参数,我们添加了一个新的关键字“action”,并赋值给他一个默认的“store_true”,表示,如果这个选项被列出来就表示为true,若没有则为false。
当再给选项一个特定的值时反而会报错,因为选项本身代表了true
注意帮助选项的不同。
缩略选项
如果你对于命令行比较熟悉的化妆,你会注意到我们还没有提及到缩略选项,它其实要求很简单
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"
结果
$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity