注1:本文大部分转载自地址,少部分是我自己的内容,如果后面有时间的话,我会把自己的代码加入进来,并以我自己的代码作为说明的案例。
注2:原作者是Tshepang Lekhonkhobe,转载地址应该是翻译版。原版非常的长,翻译版也非常的长,而且翻译版还有部分未翻译直接贴原文。
注3:这篇教程旨在作为 argparse 的入门介绍,此模块是 Python 标准库中推荐的命令行解析模块。还有另外两个模块可以完成同样的任务,称为 getopt (对应于 C 语言中的 getopt() 函数) 和被弃用的 optparse。还要注意 argparse 是基于 optparse 的,因此用法与其非常相似。

许多还在坑里翻滚的小伙伴看着大神们写的那些成熟的代码——尤其是python的一些好的git项目——多数都带有自己的输入参数,是不是特别好奇这些功能是怎么做到的。本文就介绍Argparse函数,来告诉大家如何在命令行传入参数。在学会后加入main函数里面加入几行,也可以让你写的校program增色不少,闲言少叙,让我们从一个最基础的例子开始:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

运行结果:

python prog.py
python 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

从程序运行的结果可知:

  • 在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。这没有什么用处。

  • 第二行代码开始展现出 argparse 模块的作用。我们几乎什么也没有做,但已经得到一条很好的帮助信息。

  • –help 选项,也可缩写为 -h,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。指定任何内容都会导致错误。即便如此,我们也能直接得到一条有用的用法信息。

argparse模块,一般有两种参数,一种是固定参数,一种是可选参数。固定参数指的是你必须输入的一组参数,可选参数指的是你可以输入也可以不输入的参数。默认情况下,可选参数的值在没有输入时为None。

固定参数

举个例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)

系统window 10,python版本是3.7.4下运行结果(因为环境和版本不同运行结果可能不同),

>python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo>python prog.py foo
foo

程序运行的结果告诉我们:

  • 我们增加了 add_argument() 函数,该函数用于指定程序能够接受哪些命令行选项。在这个例子中,我将选项命名为 echo,与其函数一致。
  • 现在调用我们的程序必须加入一个参数。
  • parse_args()函数实际返回了指定选项的数据,即本例中的echo。
  • 这个是个神奇的变量 (不用指定哪种变量值存储在其中),你同样会注意到这个变量的名字正是你在函数中写的,即echo。

但是,请注意,尽管-help看起来很好,但是它目前并没有提供足够的帮助。例如,我们看到echo是一个固定参数,但我们不知道它的作用,只能通过猜测或阅读源代码来实现。让我们让它更有用一点:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)

然后我们得到:

python prog.py -h
usage: prog.py [-h] echopositional arguments:echo        echo the string you use hereoptional 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)

以下是该代码的运行结果:

python 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默认我们输入的是字符串。所以让我们告诉它,我们输入的是整型

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)

以下是该代码的运行结果:

>python prog.py 4
16
python 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 VERBOSITYincrease output verbosity

程序运行情况如下:

  • 上面程序的目的:当–verbosity被指定的时候显示信息,反之则不显示。
  • option是可选的,即使无赋值程序也不会报错。注意:默认情况下,未赋值的option默认值是None,这也是上面程序里非真的原因。
  • -h --help 会发生改变
  • 使用–verbosity时必须对它赋值。

上述例子接受任意整数作为–verbosity的值,但是对于我们这个小程序而言,只有两个值是有意义的,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")

输出:

>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]

程序运行情况如下:

  • 现在,该option是flag而不是某个值。 注意,我们现在指定一个新的关键字action,并将其值设置为“ store_true”。 这意味着,如果指定了该选项,则将值True分配给args.verbose。 未指定则表示False。
  • 当您实际指给它赋值时会报错,它会抱怨。
  • 留意-help信息发生的变化。

短命令行

如果你熟悉命令行使用方法,你会注意到我还没有教你上面出现过的短命令行。这其实很简单:

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

结合位置参数和可选参数
我们的程序变得越来越复杂了:

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("the square of {} equals {}".format(args.square, answer))
else:print(answer)

接着是输出:

>python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square>python prog.py 4
16>python prog.py 4 --verbose
the square of 4 equals 16>python prog.py --verbose 4
the square of 4 equals 16

注意顺序无关紧要。

How about we give this program of ours back the ability to have multiple verbosity values, and actually get to use them:

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("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:print("{}^2 == {}".format(args.square, answer))
else:print(answer)

注:format是python格式化函数,基本使用方法:“{} {}.format(argc1,argc2,…,argcn)”,不限制个数和位置

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

和输出:

>python prog.py 4
16>python prog.py 4 -v 1
4^2 == 16>python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument>python prog.py 4 -v 2
the square of 4 equals 16>python prog.py 4 -v 3
16

上面的程序看着还不错,除了最后一个,暴露了我们程序的小bug。我们需要对–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("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:print("{}^2 == {}".format(args.square, answer))
else:print(answer)

和输出:

>python 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)>python prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] squarepositional arguments:square                display a square of a given numberoptional arguments:-h, --help            show this help message and exit-v {0,1,2}, --verbosity {0,1,2}increase output verbosity

注意到错误提示和帮助信息提示发生了改变。
现在,让我们使用另一种方法。 它还与CPython可执行文件处理其自身的详细程度参数的方式匹配(请检查python --help的输出):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:print("{}^2 == {}".format(args.square, answer))
else:print(answer)

We have introduced another action, “count”, to count the number of occurrences of a specific optional arguments:

运行

>python prog.py 4
16>python prog.py 4 -v
4^2 == 16>python prog.py 4 -vv
the square of 4 equals 16>python prog.py 4 --verbosity --verbosity
the square of 4 equals 16>python prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1>python prog.py 4 -h
usage: prog.py [-h] [-v] squarepositional arguments:square           display the square of a given numberoptional arguments:-h, --help       show this help message and exit-v, --verbosity  increase output verbosity>python prog.py 4 -vvv
16

它也表现得与 “store_true” 的行为相似。

Now here’s a demonstration of what the “count” action gives. You’ve probably seen this sort of usage before.

And if you don’t specify the -v flag, that flag is considered to have None value.

As should be expected, specifying the long form of the flag, we should get the same output.

Sadly, our help output isn’t very informative on the new ability our script has acquired, but that can always be fixed by improving the documentation for our script (e.g. via the help keyword argument).

That last output exposes a bug in our program.

让我们修复一下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
# bugfix: replace == with >=
if args.verbosity >= 2:print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:print("{}^2 == {}".format(args.square, answer))
else:print(answer)

这是它给我们的输出:

$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last):File "prog.py", line 11, in <module>if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'

第一组输出很好,修复了之前的 bug。也就是说,我们希望任何 >= 2 的值尽可能详尽。

第三组输出并不理想。

让我们修复那个 bug:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:print("{}^2 == {}".format(args.square, answer))
else:print(answer)

We’ve just introduced yet another keyword, default. We’ve set it to 0 in order to make it comparable to the other int values. Remember that by default, if an optional argument isn’t specified, it gets the None value, and that cannot be compared to an int value (hence the TypeError exception).
我们引入了另一个关键词default。我们令它为0以使它能和其他整型比较。因为默认情况下,一个optional参数没有赋值之前,它都是None。所以无法和其他整型比较

然后:

python prog.py 4
16

靠以上内容,你已经可以完成很多工作了,然而我们其实只是学了皮毛。argparse模块是非常强大的,在最后结束之前我们再努力一把。

进行一些小小的改进

再坚持一下,我们这个教程马上就要结束了。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:print("{} to the power {} equals {}".format(args.x, args.y, answer))
elif args.verbosity >= 1:print("{}^{} == {}".format(args.x, args.y, answer))
else:print(answer)

输出:

python prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y
python prog.py -h
usage: prog.py [-h] [-v] x ypositional arguments:x                the basey                the exponentoptional arguments:-h, --help       show this help message and exit-v, --verbosity
$ python3 prog.py 4 2 -v
4^2 == 16

注意到我们到目前一直通过verbosity 来调整显示的内容。下面我们用verbosity来显示更多的内容。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:print("Running '{}'".format(__file__))
if args.verbosity >= 1:print("{}^{} == ".format(args.x, args.y), end="")
print(answer)

输出:

python prog.py 4 2
16
python prog.py 4 2 -v
4^2 == 16
python prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16

矛盾的选项

So far, we have been working with two methods of an argparse.ArgumentParser instance. Let’s introduce a third one, add_mutually_exclusive_group(). It allows for us to specify options that conflict with each other. Let’s also change the rest of the program so that the new functionality makes more sense: we’ll introduce the --quiet option, which will be the opposite of the --verbose one:
目前位置,我们只用argparse.ArgumentParser的两种函数。下面介绍第三种add_mutually_exclusive_group()。它可以对相互冲突的选项进行赋值。程序的后半部分也重新进行改写,让整个程序显得更合理些。

import argparseparser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.yif args.quiet:print(answer)
elif args.verbose:print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:print("{}^{} == {}".format(args.x, args.y, answer))

Our program is now simpler, and we’ve lost some functionality for the sake of demonstration. Anyways, here’s the output:

$ python3 prog.py 4 2
4^2 == 16
$ python3 prog.py 4 2 -q
16
$ python3 prog.py 4 2 -v
4 to the power 2 equals 16
$ python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python3 prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose

That should be easy to follow. I’ve added that last output so you can see the sort of flexibility you get, i.e. mixing long form options with short form ones.

Before we conclude, you probably want to tell your users the main purpose of your program, just in case they don’t know:

import argparseparser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.yif args.quiet:print(answer)
elif args.verbose:print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:print("{}^{} == {}".format(args.x, args.y, answer))

Note that slight difference in the usage text. Note the [-v | -q], which tells us that we can either use -v or -q, but not both at the same time:

$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
x the base
y the exponent

optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
后记
argparse模块所含的内容比本文所写的要多的多。它的文档更具体更全面,并且案列更多。在阅读完本文后,你应该能够轻松的上手argparse。

Argparse 教程相关推荐

  1. argparse教程

    argparse教程 argparse是用来干什么的? 位置参数和可选参数 测试argparse的功能 test1 test2 test3 test4 test5-可选参数 test6-action选 ...

  2. python 命令行 解析模块 optparse、argparse

    optparse:https://docs.python.org/zh-cn/3/library/optparse.html argparse :https://docs.python.org/zh- ...

  3. ZetCode Python 教程

    来源:ApacheCN ZetCode 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request. 请您勇敢地去翻译和改进翻译.虽然 ...

  4. [编程基础] Python命令行解析库argparse学习笔记

    Python argparse教程展示了如何使用argparse模块解析Python中的命令行参数. 文章目录 1 使用说明 1.1 Python argparse可选参数 1.2 Python ar ...

  5. 以optee的sign_encrypt.py为例讲解argparse命令解析模块

    Argparse是 Python 标准库中推荐的命令行解析模块.该模块会自动生成提示信息,且在用户给程序传入非法参数时报错. 刚好最近在看optee的sign_encrypt.py,以它为例介绍pyt ...

  6. git diff 比较文件_使用Python创建你自己的diff工具

    为什么我需要自己的diff工具? 我经常使用git跟踪我的编码项目.文章.业务工作等等.git的一个美妙之处在于,你可以通过简单地使用其内置的diff功能来轻松地比较你的工作的不同状态.要使用这个功能 ...

  7. python diff函数_使用Python创建你自己的diff工具

    为什么我需要自己的diff工具? 我经常使用git跟踪我的编码项目.文章.业务工作等等.git的一个美妙之处在于,你可以通过简单地使用其内置的diff功能来轻松地比较你的工作的不同状态.要使用这个功能 ...

  8. python 常用包_Python常用指引

    Python常用指引 Python常用指引的形式来源于Linux文档项目的常用指引章节,是一系列独立.指定主题并尝试完全覆盖该主题的文章集合.致力于提供比Python库参考帮助更详尽的文档. Pyth ...

  9. python 命令行 参数_Python命令行参数

    python 命令行 参数 Python Command line arguments are input parameters passed to the script when executing ...

最新文章

  1. 转:GridView 中如何给删除按钮添加提示
  2. 设计模式学习笔记——桥接(Bridge)模式
  3. dataGrid点击显示数据到textBox
  4. java并发之Future与Callable使用
  5. iPhone 12明天凌晨发布,有望推动苹果市值超过2.2万亿美元
  6. 【算法】删去k个数字后的最小值
  7. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理
  8. Deep Glow mac(AE高级辉光特效插件)支持AE2022
  9. 四、固态硬盘存储技术的分析(论文)
  10. 用Actix写的一个类似于Facemash的小项目总结
  11. 调用Kinect 2.0摄像头
  12. java double精度丢失 0.1+0.2不等于0.3
  13. Unity 接入Apple登录
  14. Android开发之实时更新系统时间
  15. java异常之-ClassNotFoundException: .......web.context.ContextLoaderServlet
  16. 贪心(Ball,HDU 5821)
  17. Kean专题:内容JIG(拖拽)
  18. 2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录
  19. 三国志战略版:Daniel_S7赤壁之战前瞻2_细节爆料
  20. Android手机电池不耐用,安卓手机不耐用? 3款省电软件对比评测

热门文章

  1. 优漫动游关于零基础学平面设计需要多久?
  2. day7-字典作业(1)
  3. java毕业设计水星家纺网站源码+lw文档+mybatis+系统+mysql数据库+调试
  4. Scrapy爬取某装修网站部分装修效果图
  5. 责任链模式在王者荣耀中的应用
  6. 格子游戏 ACWING-1250
  7. java学习所需软件
  8. 学习笔记|Flask部署Pytorch模型+Gunicorn+Docker
  9. pom文件报错常用解决方式
  10. GAN原理及相关发展总结