Python Argparse Tutorial (Python Agrparse 教程)

2024-03-17 11:58

本文主要是介绍Python Argparse Tutorial (Python Agrparse 教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文内容来源于Python官方文档,均为本人翻译得来,部分内容可能翻译不准确或者不优雅,欢迎大家批评指正。

Argparse教程

argparse是Python标准库里的推荐的命令行解析模块。

Note: Python还有两个可以完成同样功能的模块,一个是getopt(和C语言中的getopt()函数等价的),还要一个是不太建议用的模块optparse。需要注意的是argparse是基于optparse的,因此它们在使用上是非常相似的。

基础

我们首先在prog.py中进行一些简单的定义,可以通过python3 prog.py来运行这段代码:

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

位置参数介绍

一个简单的例子:

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] echopositional arguments:echooptional arguments:-h, --help  show this help message and exit
$ python3 prog.py foo
foo

从上面的代码可以看出:

  • 我们添加了add_argument()方法,通过这个方法可以指定我们要让我们的代码接受什么命令行选项。
  • 我们运行代码时需要在命令行中添加我们需要的那个选项
  • parse_args()方法实际上从指定的选项中范湖一些数据,在上面的例子中,返回的是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)

看一下对上述代码的运行结果:

$ python3 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)

下面是运行上述代码的结果:

$ 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默认把我们给的选项当成strings。所以,让我们来告诉argparse将输入的选项当作integer:

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

输入如下:

$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]optional arguments:-h, --help            show this help message and exit--verbosity VERBOSITYincrease output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument

让我们来解释一下发生了什么:

  • 这一段代码的意思是当 --verbosity被指定的时候就显示一些东西,当其没有被指定的时候就什么也不显示。
  • 为了表明该选项实际上是可选的,在没有指定它的时候程序也能够正确运行。
  • 需要注意的是,在默认情况下,如果我们没有使用可选参数,那么与之相关的变量将被如遇None作为值,在上面的例子中,可选参数args.verbosity被赋予None值,这就是它无法测试if语句的真值的原因。
  • 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")

对应的输出:

$ 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]optional arguments:-h, --help  show this help message and exit--verbose   increase output verbosity

接下来解释一下发生了什么:

  • 这个选项现在更多的是一个标志,而不是需要一个值的东西。我们甚至更改了这个选项的名字以符合这个想法。需要注意的是,我们现在指定了一个新的关键字:action,并且赋予其一个值:"store_true"。这意味着,如果这个选项被指定了,那么args.verbose会被赋予值True。如果我们不指定它,那么它会被赋予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")

我们看一下代码运行的结果:

$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]optional arguments:-h, --help     show this help message and exit-v, --verbose  increase output verbosity

需要注意的是这个新的特点在help提示中也会反映出来。

结合位置参数与可选参数

我们的程序的复杂性持续增加:

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)

接下来看一下程序的运行结果:

$ 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
  • 我们在程序中重新加入了位置参数,因此带来了第一次运行的错误。
  • 需要注意的是选项的次序是不重要的。

现在让我们给这个程序一些拥有多个冗长值的能力,并且是加上使用一下它们:

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)

接下来看一下程序的运行结果:

$ 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

这些结果看起来都是正常的,除了最后一个,最后一个暴露了我们程序里的一个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)

接下来是程序的输出:

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

需要注意的是这个变化也会反映在error信息和help信息中。

现在,让我们使用一个不同的方法来婉转verbosity,这个方法是非常普遍的。它也和CPython可执行程序处理其详细参数的方式匹配。

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)

我们介绍了另一个action:"count",这个action的功能是计算特定可选参数出现的次数:

$ python3 prog.py 4
16
$ python3 prog.py 4 -v
4^2 == 16
$ python3 prog.py 4 -vv
the square of 4 equals 16
$ python3 prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python3 prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v] squarepositional arguments:square           display a square of a given numberoptional arguments:-h, --help       show this help message and exit-v, --verbosity  increase output verbosity
$ python3 prog.py 4 -vvv
16
  • 是的,它现在更多的是我们的脚本的以前版本的一个标志(和action="store_true"类似)。这应该能解释出现的错误。
  • 它的行为也类似于"store_true"这个action。
  • 现在这里有一个对于"count" action输出的演示。你可能以前已经见过这种用法了。
  • 如果你不指定-v这个标志,这个标志默认是None值。
  • 正如我们预期的那样,指定标志的长格式,我们会得到同样的输出。
  • 比较令人难受的是,我们的帮助文档并不能给我们的脚本获得的新功能太多的信息,但是可以通过改进脚本的文档(例如通过帮助关键词参数)来解决问题。
  • 最后一个输出暴露了我们程序里的一个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",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)

接下来是输出:

$ python3 prog.py 4 -vvv
the square of 4 equals 16
$ python3 prog.py 4 -vvvv
the square of 4 equals 16
$ python3 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的值都尽可能作为verbose。
  • 第三个输出是有问题的。

 

未完待续

likebeta也翻译了一些,可以看一下他的Argparse简易教程

这篇关于Python Argparse Tutorial (Python Agrparse 教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818880

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以