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

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

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

那么在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模块解析命令行选项的更多相关文章

  1. python 解析命令行选项

    问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...

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

    简介 optparse module---自版本3.2以来已弃用:optparse模块已弃用,将不再进一步开发:将继续使用argparse模块进行开发.optparse使用一种更具声明性的命令行解析方 ...

  3. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  4. python argparse模块解析命令行选项简单使用

    argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...

  5. Python内置的一个用于命令项选项与参数解析的模块argparse

    一.argparse简单使用 我们先来看一个简单示例.主要有三个步骤: 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() ...

  6. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  7. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  8. python学习之argparse模块的使用

    以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...

  9. 使用ACE_Get_Opt解析命令行

    当我们用C++开发一些C++控制台小工具时,会需要一些用户输入的参数来决定程序如何工作和执行,而用户输入参数的方式大部分都是采用命令行参数的方式. 比如上一篇文章 玩转Windows服务系列--命令行 ...

随机推荐

  1. 罗振宇2022"时间的朋友"跨年演讲

    罗振宇2022"时间的朋友"跨年演讲 行就行,不行我再想想办法. 原来,还能这么干! 堆资源不是解决问题的唯一道路,还是那句话:"处于困境中的人往往只关注自己的问题.而解 ...

  2. js 获取和设置css3 属性值的实现方法

    众多周知 CSS3 增加了很多属性,在读写的时候就没有原先那么方便了. 如:<div style="left:100px"></div> 只考虑行间样式的话 ...

  3. BootstrapBlazor实战 Tree树形控件使用(2)

    继续上篇实战BootstrapBlazor树型控件Tree内容, 本篇主要讲解整合Freesql orm快速制作数据库后台维护页面 demo演示的是Sqlite驱动,FreeSql支持多种数据库,My ...

  4. 什么是机器学习的特征工程?【数据集特征抽取(字典,文本TF-Idf)、特征预处理(标准化,归一化)、特征降维(低方差,相关系数,PCA)】

    2.特征工程 2.1 数据集 2.1.1 可用数据集 Kaggle网址:https://www.kaggle.com/datasets UCI数据集网址: http://archive.ics.uci ...

  5. 『忘了再学』Shell基础 — 9、Bash中的特殊符号(一)

    目录 1.双单引号 2.双引号 3.$符号 4.反引号 5.$()符号 6.#符号 7.\符号 1.双单引号 '':单引号.在单引号中所有的特殊符号,如$和"`"(反引号)都没有特 ...

  6. Asynchronous Methods for Deep Reinforcement Learning

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! ICML 2016 Abstract 我们提出了一个概念上简单且轻量级的深度强化学习框架,该框架使用异步梯度下降来优化深度神经网络控制器. ...

  7. Kernel pwn 基础教程之 Heap Overflow

    一.前言 在如今的CTF比赛大环境下,掌握glibc堆内存分配已经成为了大家的必修课程.然而在内核态中,堆内存的分配策略发生了变化.笔者会在介绍内核堆利用方式之前先简单的介绍一下自己了解的内核内存分配 ...

  8. C++ atomic 和 memory ordering 笔记

    如果不使用任何同步机制(例如 mutex 或 atomic),在多线程中读写同一个变量,那么,程序的结果是难以预料的.简单来说,编译器以及 CPU 的一些行为,会影响到程序的执行结果: 即使是简单的语 ...

  9. XCTF练习题---MISC---Aesop_secret

    XCTF练习题---MISC---Aesop_secret flag:flag{DugUpADiamondADeepDarkMine} 解题步骤: 1.观察题目,下载附件 2.下载完成后发现是个gif ...

  10. 最佳实践 | 通过使用 Jira Service Management 改进 HR 工作流程

    ​​ Jira Service Management 承诺解锁高速团队.技术团队和与之合作的业务部门都可以从 Jira Service Management中受益,尤其是 HR 团队. Atlassi ...