网易首页 > 网易号 > 正文 申请入驻

Python 中使用 argparse 解析命令行参数 | Linux 中国

0
分享至

导读:使用 argparse 模块为应用程序设置命令行选项。                               

本文字数:2963,阅读时长大约: 3分钟

https://linux.cn/article-13986-1.html
作者:Moshe Zadka
译者:MjSeven

有一些第三方库用于命令行解析,但标准库 argparse 与之相比也毫不逊色。

无需添加很多依赖,你就可以编写带有实用参数解析功能的漂亮命令行工具。

Python 中的参数解析

使用 argparse 解析命令行参数时,第一步是配置一个 ArgumentParser 对象。这通常在全局模块内完成,因为单单_配置_一个解析器没有副作用。

  1. import argparse

  2. PARSER = argparse.ArgumentParser()

ArgumentParser 中最重要的方法是 .add_argument(),它有几个变体。默认情况下,它会添加一个参数,并期望一个值。

  1. PARSER.add_argument("--value")

查看实际效果,调用 .parse_args()

  1. PARSER.parse_args(["--value", "some-value"])

  1. Namespace(value='some-value')

也可以使用 = 语法:

  1. PARSER.parse_args(["--value=some-value"])

  1. Namespace(value='some-value')

为了缩短在命令行输入的命令,你还可以为选项指定一个短“别名”:

  1. PARSER.add_argument("--thing", "-t")

可以传入短选项:

  1. PARSER.parse_args("-t some-thing".split())

  1. Namespace(value=None, thing='some-thing')

或者长选项:

  1. PARSER.parse_args("--thing some-thing".split())

  1. Namespace(value=None, thing='some-thing')

类型

有很多类型的参数可供你使用。除了默认类型,最流行的两个是布尔类型和计数器。布尔类型有一个默认为 True 的变体和一个默认为 False 的变体。

  1. PARSER.add_argument("--active", action="store_true")

  2. PARSER.add_argument("--no-dry-run", action="store_false", dest="dry_run")

  3. PARSER.add_argument("--verbose", "-v", action="count")

除非显式传入 --active,否则 active 就是 Falsedry-run 默认是 True,除非传入 --no-dry-run。无值的短选项可以并列。

传递所有参数会导致非默认状态:

  1. PARSER.parse_args("--active --no-dry-run -vvvv".split())

  1. Namespace(value=None, thing=None, active=True, dry_run=False, verbose=4)

默认值则比较单一:

  1. PARSER.parse_args("".split())

  1. Namespace(value=None, thing=None, active=False, dry_run=True, verbose=None)

子命令

经典的 Unix 命令秉承了“一次只做一件事,并做到极致”,但现代的趋势把“几个密切相关的操作”放在一起。

gitpodmankubectl 充分说明了这种范式的流行。argparse 库也可以做到:

  1. MULTI_PARSER = argparse.ArgumentParser()

  2. subparsers = MULTI_PARSER.add_subparsers()

  3. get = subparsers.add_parser("get")

  4. get.add_argument("--name")

  5. get.set_defaults(command="get")

  6. search = subparsers.add_parser("search")

  7. search.add_argument("--query")

  8. search.set_defaults(command="search")

  1. MULTI_PARSER.parse_args("get --name awesome-name".split())

  1. Namespace(name='awesome-name', command='get')

  1. MULTI_PARSER.parse_args("search --query name~awesome".split())

  1. Namespace(query='name~awesome', command='search')`

程序架构

使用 argparse 的一种方法是使用下面的结构:

  1. ## my_package/__main__.py

  2. import argparse

  3. import sys

  4. from my_package import toplevel

  5. parsed_arguments = toplevel.PARSER.parse_args(sys.argv[1:])

  6. toplevel.main(parsed_arguments)

  1. ## my_package/toplevel.py

  2. PARSER = argparse.ArgumentParser()

  3. ## .add_argument, etc.

  4. def main(parsed_args):

  5. ...

  6. # do stuff with parsed_args

在这种情况下,使用 python -m my_package 运行。或者,你可以在包安装时使用 python-packaging.readthedocs.io 入口点。

总结

argparse 模块是一个强大的命令行参数解析器,还有很多功能没能在这里介绍。它能实现你想象的一切。

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
摊牌了!赖清德放话要勾结日本,让大陆放弃攻台,国防部:不惯着

摊牌了!赖清德放话要勾结日本,让大陆放弃攻台,国防部:不惯着

不似少年游
2026-06-28 07:20:31
贝尔萨坑乌拉圭,24年前坑阿根廷,百年世界杯梦碎

贝尔萨坑乌拉圭,24年前坑阿根廷,百年世界杯梦碎

老曁科普
2026-06-27 13:47:38
杨尚昆晚年病重,多次嘱咐身边人:一定不要让刘少奇儿子刘源知晓

杨尚昆晚年病重,多次嘱咐身边人:一定不要让刘少奇儿子刘源知晓

兵卒史
2026-06-28 07:17:02
中国移动空调欧洲断货,免安装为何能绕过3000欧元安装费壁垒?

中国移动空调欧洲断货,免安装为何能绕过3000欧元安装费壁垒?

小柱解说游戏
2026-06-27 03:42:28
白玉兰奖落幕:3人口碑暴涨,2人升咖,1人镀金失败,唯她被骂惨

白玉兰奖落幕:3人口碑暴涨,2人升咖,1人镀金失败,唯她被骂惨

荣亭小吏
2026-06-27 10:27:59
河南新乡一学校发视频称“复读考上清华北大奖100万”,教体局工作人员回应“不允许这样宣传,会向领导汇报”

河南新乡一学校发视频称“复读考上清华北大奖100万”,教体局工作人员回应“不允许这样宣传,会向领导汇报”

极目新闻
2026-06-27 18:21:08
等到了!哈里梅根带娃杀回英国,查尔斯主动开门

等到了!哈里梅根带娃杀回英国,查尔斯主动开门

全球奇趣娱乐八卦
2026-06-28 05:40:10
联想警告:高价内存将是贯穿2030年的“新常态”,涨价后再难回落

联想警告:高价内存将是贯穿2030年的“新常态”,涨价后再难回落

IT之家
2026-06-27 21:30:17
上海最贵的8样食物,有钱也未必全吃过

上海最贵的8样食物,有钱也未必全吃过

简食记工作号
2026-06-28 00:17:21
太阳报:加纳乔换脏辫发型被群嘲,还被痛批是文化挪用

太阳报:加纳乔换脏辫发型被群嘲,还被痛批是文化挪用

懂球帝
2026-06-27 22:31:07
16分领跑就夺冠?中超最大误会!成都蓉城争冠隐患其实藏不住了

16分领跑就夺冠?中超最大误会!成都蓉城争冠隐患其实藏不住了

菜菜说体育
2026-06-28 00:41:10
44岁彭于晏伦敦街头被偶遇,染银发戴粉帽,真人185小奶狗既视感

44岁彭于晏伦敦街头被偶遇,染银发戴粉帽,真人185小奶狗既视感

木子爱娱乐大号
2026-06-27 19:04:02
2026艾美奖预测来了!这些剧稳了,最佳女主唯一悬念是她?

2026艾美奖预测来了!这些剧稳了,最佳女主唯一悬念是她?

浅遇时光
2026-06-26 11:03:25
2026年高考600分扎堆泛滥!读懂3个核心真相,摆脱分数焦虑

2026年高考600分扎堆泛滥!读懂3个核心真相,摆脱分数焦虑

老特有话说
2026-06-28 01:15:03
中国正式进入“超级内卷”时代!只有一种人能赚钱(深度)

中国正式进入“超级内卷”时代!只有一种人能赚钱(深度)

新浪财经
2026-06-23 08:51:12
中国种树治沙,到底动了西方谁的奶酪?越深挖就越让人清醒

中国种树治沙,到底动了西方谁的奶酪?越深挖就越让人清醒

掠影后有感
2026-06-27 09:47:32
徐帆回应离婚才9个月,68岁冯小刚和养女贴脸拍照亲密 ,关系很好

徐帆回应离婚才9个月,68岁冯小刚和养女贴脸拍照亲密 ,关系很好

沧海一书客
2026-05-31 18:08:08
有没有人敢爆自己的瓜?网友:确定玩这么大吗?

有没有人敢爆自己的瓜?网友:确定玩这么大吗?

夜深爱杂谈
2026-02-18 20:55:58
送走韩国队成共识,韩国球迷:为何全世界都讨厌我们?

送走韩国队成共识,韩国球迷:为何全世界都讨厌我们?

许三岁
2026-06-27 11:56:17
悉尼妹的无删减影片,太生猛了

悉尼妹的无删减影片,太生猛了

i书与房
2026-06-27 16:27:57
2026-06-28 08:23:00
Linux
Linux
Linux 中国开源社区
8018文章数 73112关注度
往期回顾 全部

科技要闻

GPT-5.6发布,你暂时用不了!Mythos也放行

头条要闻

美以黎框架协议被指"签了个寂寞" 以高官:重大错误

头条要闻

美以黎框架协议被指"签了个寂寞" 以高官:重大错误

体育要闻

世界杯最火门将,站到了阿根廷和梅西面前

娱乐要闻

四提白玉兰终封后,杨紫:仍觉不真实

财经要闻

OpenAI推迟IPO重创软银!

汽车要闻

搭载华为乾崑ADS 5 全新猛士M817上市售29.99万起

态度原创

教育
健康
亲子
手机
公开课

教育要闻

假如给你一个亿默写D开头单词

“无糖汤圆”是否隐藏着健康陷阱?

亲子要闻

媳妇怀二胎体重超标,四维彩超做了2小时,医生说还贫血

手机要闻

iPhone 18或配备罕见的9GB内存,苹果刀法依旧!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版