Python:用argparse模块解析命令行选项

1. 用argparse模块解析命令行选项

我们在上一篇博客《Linux:可执行程序的Shell传参格式规范》中介绍了Linux系统Shell命令行下可执行程序应该遵守的传参规范(包括了各种选项及其参数)。Python命令行程序做为其中一种,其传参中也包括了位置参数(positional arguments)可选参数(optional arguments)

Python:用argparse模块解析命令行选项

(注意,可选参数的选项名称以---打头,位置参数和可选参数的先后顺序可以任意排布)

那么在Python程序中我们如何解析在命令行中提供的各种选项呢?(选项保存在sys.argv中)我们可以使用argparse模块。我们用下面这个search.py程序做例子:

1.1 创建parser对象

首先我们需要创建parser对象:

import argparse
parser = argparse.ArgumentParser(description="search some files")

1.2 添加选项声明

然后使用parser.add_argument()方法添加想要支持的选项声明。add_argument()的调用参数承担了不同的功能:

  • dest指定了用来保存解析结果的属性名称。
  • metavar用于显示帮助信息,如果不指定则默认为大写的属性名。
  • action指定了与参数处理相关的行为(store表示存储单个值,append表示将多个值存到一个列表中)。

我们尝试依次添加如下选项声明进行测试:

解析位置参数

parser.add_argument(dest="filenames", metavar="filename", nargs="*")

该参数为位置参数,不需要像可选参数的选项一样用---打头。位置参数一般是必须要提供的(虽然这里你不提供也能保存为[])。nargs="*"表示将所有额外命令行参数保存在一个列表中。

解析可选参数


parser.add_argument("-p", "--pat", metavar="pattern", required=True, dest="patterns", action="append", help="text pattern to search for")

-p--pat两种选项名称都可接收(前者是简写,后者是全称)。我们在上一篇博客说过,在调用Shell命令时规定对于简写的选项名用-p ××形式传参,对于全称的选项名我们有--pat ××--pat=××两种形式。不过Python脚本时你用-p=××也能解析,不过一般不建议这样搞。action="append"意为允许命令行参数重复多次,将所有参数值保存在列表中,require=True意味着参数必须要提供一次。

parser.add_argument("-v", dest="verbose", action="store_true", help="verbose mode") 

store_true意思为设定为一个布尔标记,标记的值取决于参数是否有提供。

parser.add_argument("-o", dest="outfile", action="store", help="output file") 

类似上面,这里store意思为接收一个单独的值并保存为字符串

parser.add_argument("--speed", dest="speed", action="store", choices={"slow", "fast"}, default="slow", help="search speed") 

同上,该参数也是接受一个值,但只能在特定范围中{"slow", "fast"}中选择,且默认"slow""

1.2 解析选项

然后我们就可以解析选项并使用传入的参数了:


args = parser.parse_args()

# 注意在使用参数时,是用的参数的dest名字
print(args.filenames)
print(args.patterns)
print(args.verbose)
print(args.outfile)
print(args.speed)

2. 测试

以上的程序定义了一个命令解析器,我们可以设置-h选项查看其用法:

(base) orion-orion@MacBook-Pro Python-Lang % python search.py -h        
usage: search.py [-h] -p pattern [-v] [-o OUTFILE] [--speed {slow,fast}] [filename ...]

search some files

positional arguments:
  filename

optional arguments:
  -h, --help            show this help message and exit
  -p pattern, --pat pattern
                        text pattern to search for
  -v                    verbose mode
  -o OUTFILE            output file
  --speed {slow,fast}   search speed

接下来我们展示数据在程序中的显示方式。比如我们尝试不传入必需的-p/--pat选项参数:

(base) orion-orion@MacBook-Pro Python-Lang % python search.py foo.txt bar.txt
usage: search.py [-h] -p pattern [-v] [-o OUTFILE] [--speed {slow,fast}] [filename ...]
search.py: error: the following arguments are required: -p/--pat

如上所示,解释器会提醒我们参数没传入。我们注意到usage-p pattern并没有加方括号[],说明该参数不是可选的,必须要提供。

接下来我们提供完整参数,大家可以仔细观察print()语句的输出:

(base) orion-orion@MacBook-Pro Python-Lang % python search.py -v -p spam --pat=eggs foo.txt bar.txt 
['foo.txt', 'bar.txt']
['spam', 'eggs']
True
None
slow

可以看到如上所示,因为提供了参数-v,故args.verboseTrue。因为没提供-o ×××参数,故args.outfileNone

(base) orion-orion@MacBook-Pro Python-Lang % python search.py -v -p spam --pat=eggs foo.txt bar.txt -o results
['foo.txt', 'bar.txt']
['spam', 'eggs']
True
results
slow

可以看到如上所示,设置了提供了-o results,故args.outfile打印结果为results

(base) orion-orion@MacBook-Pro Python-Lang % python search.py -v -p spam --pat=eggs foo.txt bar.txt -o results --speed=fast
['foo.txt', 'bar.txt']
['spam', 'eggs']
True
results
fast

如上所示为提供了可选参数--speed的情况。

3. 讨论

一旦选项给出后,我们只需要简单地执行parser.parse()方法。这么做会处理sys.argv的值,并返回结果实例。如果我们手动处理sys.argv或者使用getopt模块(仿照类似的C库打造),就会重复编写许多argparse已经提供的代码,因此在新项目中应该优先选择argparse

参考

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python:用argparse模块解析命令行选项 - Python技术站

(0)
上一篇 2023年4月2日 下午5:35
下一篇 2023年4月2日 下午5:35

相关文章

  • Git:国内用命令行访问GitHub的方法

    1 直接改Hosts文件(现在不太管用了) 如果你是Linux或Mac系统,那么可以通过命令sudo vim /etc/hosts打开Hosts文件,并加入以下内容: 140.82.114.25 alive.github.com 140.82.112.25 live.github.com 185.199.108.154 github.githubassets…

    Linux 2023年4月17日
    00
  • Linux:管道命令与文本处理三剑客(grep、sed、awk)

    1 管道命令(pipe)介绍 众所周知,bash命令执行的时候会输出信息,但有时这些信息必须要经过几次处理之后才能得到我们想要的格式,此时应该如何处置?这就牵涉到 管道命令(pipe) 了。管道命令使用的是|这个界定符号。另外,管道命令与连续执行命令是不一样的,这点下面我们会说明。 我们先来看一个管道命令的例子。假设我们需要看/etc目录下有多少文件,那么可…

    Linux 2023年4月18日
    00
  • Python:对程序做性能分析及计时统计

    1.对整个程序的性能分析 如果只是想简单地对整个程序做计算统计,通常使用UNIX下的time命令就足够了。 (base) ➜ Learn-Python time python someprogram.py python someprogram.py 0.10s user 0.01s system 98% cpu 0.117 total 由于我用的是Mac系统…

    Python开发 2023年4月2日
    00
  • Linux:进程模型和进程管理

    1 进程与程序 在Linux系统中,执行一个程序或命令就可以触发一个进程,系统会给予这个进程一个ID,称为PID,同时根据触发这个进程的用户与相关属性关系,基于这个PID一组有效的权限设置。如下图所示(图片来自《鸟哥的Linux私房菜》[1]): 举个常见的例子,我们要操作系统的时候通常是利用ssh连接程序或直接在主机上登录,然后获取shell。默认的she…

    Linux 2023年4月17日
    00
  • Python:conda install 和pip install的区别

    pip是个安装包的软件,conda是个环境管理的工具。conda能够安装多个python解释器,pip不行。因此conda在实际开发中是主要用来隔离不同的python版本和Tensorflow&Pytorch的环境(env)的。 一般Python可分为系统自带的和在conda中安装的。我们可以用下列命令查看本机上所有可用的Python环境: (bas…

    Python开发 2023年4月2日
    00
  • Python:浮点数取整、格式化和NaN处理

    1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负)。 print(int(2.7)) # 2 print(int(-2.7)) # -2 PS: 上面所调用的int()函数实际上可视为调用int这个类的__new__()方法。事实上我还见过代码用下面这种奇技淫巧写法来创建int对象: type = int…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部