python命令行解析之parse_known_args()函数和parse_args()

本文详细介绍如何使用Python的argparse模块进行命令行参数解析,包括如何定义参数、解析参数及处理未知参数,适用于需要处理复杂命令行输入的程序开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令行解析

首先导入命令行解析模块 

import argparse
import sys

然后创建对象

parse=argparse.ArgumentParser() 

然后增加命令行

对于函数add_argumen()第一个是选项,第二个是数据类型,第三个默认值,第四个是help命令时的说明

parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate")
parse.add_argument("--max_steps",type=int,default=2000,help="max")
parse.add_argument("--hidden1",type=int,default=100,help="hidden1")

然后解析,其实不需要加入sys.argv[1:],直接arg=parse.parse_args()

arg=parse.parse_args(sys.argv[1:])

其中参数sys.argv[1:]是命令行语句中从第一个到最后。

如在ubuntu下输入命令行python gg.py --learning_rate=20 --max_steps=10

sys.argv[1:]=['--learning_rate=20', '--max_steps=10']  是一个列表

输入命令行python gg.py --learning_rate 20 --max_steps 10    ( 一般这些写的形式比较多)

sys.argv[1:]=['--learning_rate', '20', '--max_steps', '10']

arg=parse.parse_args(sys.argv[1:])
flags,unparsed=parse.parse_known_args(sys.argv[1:])

arg=parse_args()输出的argnamespace空间,结果是Namespace(hidden1=100, learning_rate=20.0, max_steps=10)

flags, unparsed=parse_known_args()函数输出结果为flags和unparsed,flags同parse_args()输出结果相同,Namespace(hidden1=100, learning_rate=20.0, max_steps=10)


代码

import argparse
import sys

parse=argparse.ArgumentParser()
parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate")
parse.add_argument("--max_steps",type=int,default=2000,help="max")
parse.add_argument("--hidden1",type=int,default=100,help="hidden1")
arg=parse.parse_args()

print(sys.argv[1:])
print(type(sys.argv[1:]))
print(arg)
print(type(arg))
print(vars(arg))            #vars为返回对象的属性词典
print(arg.learning_rate)
print(arg.max_steps)
print(arg.hidden1)

#命令行
$ python main.py --learning_rate=20 --max_steps=10

#输出
['--learning_rate=20', '--max_steps=10']
<class 'list'>
Namespace(hidden1=100, learning_rate=20.0, max_steps=10)
<class 'argparse.Namespace'>
{'hidden1': 100, 'learning_rate': 20.0, 'max_steps': 10}
20.0
10
100

如果输入python main.py --learning_rate 20 --max_steps 10     一般这样写的形式比较多

除了sys.argv[1:]输出结果为5个元素的列表外,一样可以解析出Namespace(hidden1=100, learning_rate=20.0, max_steps=10)

import argparse
import sys

parse=argparse.ArgumentParser()
parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate")
parse.add_argument("--max_steps",type=int,default=2000,help="max")
parse.add_argument("--hidden1",type=int,default=100,help="hidden1")

flags,unparsed=parse.parse_known_args(sys.argv[1:])
print(sys.argv[1:])
print(type(sys.argv[1:]))
print(flags)
print(type(flags))
print(vars(flags))            #vars为返回对象的属性词典
print(flags.learning_rate)
print(flags.max_steps)
print(flags.hidden1)
print(unparsed)

#输入
#也可以使用python main.py --learning_rate=20 --max_steps=10,都一样
$ python main.py --learning_rate 20 --max_steps 10

#输出
['--learning_rate', '20', '--max_steps', '10']
<class 'list'>
Namespace(hidden1=100, learning_rate=20.0, max_steps=10)
<class 'argparse.Namespace'>
{'hidden1': 100, 'learning_rate': 20.0, 'max_steps': 10}
20.0
10
100
[]

可以证明:

arg=parse_args()和 flags, unparsed=parse_known_args()用法基本一样,都是解析输出参数的

<think>首先,用户的问题是关于Python的argparse模块的parse_known_args()方法的返回值。用户说:"我想理解Python中argparse模块parse_known_args()方法的返回值 请问Python argparse parse_known_args() 返回值详解"。所以,我需要详细解释这个方法的返回值。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。例如,变量、不等式、方程等。在这个上下文中,可能没有太多数学表达式,因为这是关于Python编程的。但如果有任何数学概念,我应该使用$...$。 - 独立公式必须使用$$...$$格式并单独成段。同样,可能不适用。 - LaTeX语法正确:确保任何数学表达式的语法正确。 - 使用中文回答:整个响应必须用中文。 - 生成相关问题:在回答结束后,添加一个"相关问题"部分,列出相关的问题。 - 回答中引用的段落末尾自然地添加引用标识:例如,[^1]。用户提供了几个引用:[^1], [^2], [^3], [^4]。这些是关于argparse模块的引用。我需要引用这些在回答中。 用户提供的引用: - [^1]: 描述了一个Python脚本使用argparse的例子。 - [^2]: 提到parse_known_args()用于解析部分命令行参数。 - [^3]: 概述了argparse的核心方法。 - [^4]: 一个例子,添加一个种子参数。 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。" 但在这个消息中,没有提到上一次的问题。所以,我应该专注于当前问题。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 所以,我需要解释parse_known_args()的返回值。 首先,回忆argparse模块:它是Python标准库的一部分,用于解析命令行参数。 parse_known_args()方法:它解析命令行参数,但只解析那些在解析器中定义的参数,忽略未定义的参数。返回值是一个元组,包含两个元素:第一个是命名空间对象(包含解析出的参数),第二个是剩余未解析的参数列表。 具体来说: - 返回值:一个元组(namespace, remaining_args) - namespace:一个对象,包含解析出的参数值。可以通过点号访问,如args.arg_name。 - remaining_args:一个列表,包含命令行中未解析的参数(即那些没有被add_argument()定义的参数)。 这在处理需要传递部分参数给其他脚本时很有用。 现在,构建回答结构: 1. **介绍parse_known_args()方法**:简要说明它的用途。 2. **解释返回值**:详细描述返回值的两个部分。 3. **示例**:提供一个代码示例来演示。 4. **总结**:强调关键点。 5. **生成相关问题**:在最后添加相关问题部分。 确保使用中文。 引用来源:在回答中引用用户提供的引用。例如,当提到parse_known_args()时,可以引用[^2]或[^3]。 用户引用[^2]说:"ArgumentParser.parse_known_args(args=None, namespace=None)¶ 有时一个脚本可能只解析部分命令行参数,而将其余的参数继续传递给另一个脚本或程序。" 引用[^3]说:"parse_args() 解析参数。" 所以,我可以引用这些。 添加引用标识:在相关段落的末尾自然地添加[^数字]。 例如:"parse_known_args()方法返回一个元组,包含解析出的参数剩余参数[^2]。" 现在,生成相关问题:在回答结束后,添加"相关问题"部分,列出2-3个相关问题。 可能的基于主题的问题: 1. parse_known_args()parse_args()的区别是什么? 2. 如何在argparse中处理未知参数? 3. 一个实际使用parse_known_args()的例子是什么? 确保回答真实可靠:基于Python文档标准知识。 最终响应结构: - 开头:直接回答问题。 - 主体:逐步解释。 - 结尾:总结。 - 相关问题:列表。</think>### Python argparse parse_known_args() 返回值详解 在Python的`argparse`模块中,`parse_known_args()`方法用于解析命令行参数,特别适用于需要处理部分已知参数、而将剩余参数传递给其他脚本或程序的场景。与`parse_args()`不同,`parse_known_args()`不会因遇到未定义的参数而报错,而是将它们单独返回。下面我将逐步解释其返回值、用法注意事项,确保结构清晰易懂。回答基于Python标准库文档常见实践,并引用您提供的资料以增强可靠性。 #### 1. **parse_known_args() 方法的基本介绍** `parse_known_args()`是`ArgumentParser`类的一个方法,用于解析命令行输入。它接受两个可选参数:`args`(要解析的参数列表,默认为`sys.argv[1:]`)`namespace`(一个可选的命名空间对象)。核心用途是解析那些在解析器中明确定义的参数(如通过`add_argument()`添加的参数),而忽略未定义的参数。这在构建脚本工具时非常有用,例如当主脚本只处理部分参数,剩余参数需转发给子命令时[^2][^3]。 #### 2. **返回值详解** `parse_known_args()`的返回值是一个元组(tuple),包含两个元素: - **第一个元素(`namespace`)**:这是一个命名空间对象(通常为`argparse.Namespace`类型),存储了所有已解析的参数值。每个参数名作为属性,可以通过点号(`.`)访问。例如,如果定义了参数`--seed`,则可以通过`namespace.seed`获取其值。这个对象类似于字典,但提供了更直观的属性访问方式。 - **第二个元素(`remaining_args`)**:这是一个列表(list),包含命令行中未被解析的所有剩余参数。这些参数通常是未被`add_argument()`定义的选项或值,脚本可以进一步处理它们(如传递给其他函数或脚本)。 返回值形式为:`(namespace, remaining_args)` **关键点**: - 如果所有参数都被成功解析(即没有未定义参数),`remaining_args`将是一个空列表`[]`。 - 如果解析过程中遇到错误(如参数类型不匹配),方法会抛出异常(如`argparse.ArgumentError`),因此建议在代码中处理异常。 - 与`parse_args()`不同,`parse_known_args()`不会因未知参数而终止程序,这使其更灵活[^2][^3]。 #### 3. **示例代码演示** 以下是一个简单示例,展示`parse_known_args()`的返回值结构用法。假设我们有一个脚本,只解析`--seed`参数(引用您的示例[^4]),而忽略其他参数。 ```python import argparse # 创建解析parser = argparse.ArgumentParser(description='解析部分命令行参数') parser.add_argument('--seed', type=int, default=0, help='全局训练种子') # 添加一个已知参数 # 模拟命令行输入:python script.py --seed 42 --unknown_arg value input.txt # 使用parse_known_args()解析 args, remaining = parser.parse_known_args(['--seed', '42', '--unknown_arg', 'value', 'input.txt']) # 输出返回值 print("解析出的命名空间对象:", args) # 输出: Namespace(seed=42) print("剩余参数列表:", remaining) # 输出: ['--unknown_arg', 'value', 'input.txt'] # 访问命名空间对象中的参数 print("种子值:", args.seed) # 输出: 42 ``` **示例解释**: - 在这个例子中,`--seed`是已定义的参数,因此被解析到`args`对象中。 - `--unknown_arg``input.txt`未被定义,所以出现在`remaining`列表中。 - 脚本可以基于`remaining`进一步处理这些参数,例如调用另一个函数。 #### 4. **使用场景注意事项** - **常见应用**:在复杂命令行工具中,如构建子命令系统(例如`git commit -m "message"`),主解析器使用`parse_known_args()`处理全局参数(如`--verbose`),剩余参数传递给子命令解析器[^2][^3]。 - **优点**:提高了灵活性,允许脚本忽略不相关参数。 - **注意事项**: - 确保在解析前正确定义所有预期参数,避免逻辑错误。 - 如果未定义参数包含短选项(如`-u`),它们可能被错误解析为已知参数的缩写,建议使用`add_argument()`的`nargs`或`action`参数细化规则[^3]。 - 性能方面,`parse_known_args()`与`parse_args()`类似,开销较小,适合大多数脚本。 #### 5. **与parse_args()的区别** `parse_known_args()``parse_args()`的核心区别在于错误处理: - `parse_args()`:遇到任何未定义参数时,会直接报错并退出程序。 - `parse_known_args()`:容忍未知参数,返回它们供后续处理,更适用于模块化设计[^2][^3]。 总之,`parse_known_args()`的返回值是一个二元组,提供了解析参数的灵活方式。通过分离已知未知参数,脚本能更好地集成到复杂工作流中。如需更深入的参数处理技巧,可以参考Python官方文档或您提供的引用资料[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值