python 命令行参数解析 argparse简单分析

from: python 命令行参数解析 argparse简单分析 - CSDN博客 http://blog.csdn.net/it_way/article/details/44815141


在python 2.7 后,不推荐使用 optparse, 而推荐使用 argparse.

其它的不多说,简单的分析下我遇到的问题:我是想用 argparse 来解析不定长的命令行参数

例如:

[python]  view plain  copy
  1. import argparse  
  2. import sys  
  3.   
  4. parser = argparse.ArgumentParser(description='test parsing arguments')  
  5.   
  6. parser.add_argument('pos1', nargs='*')  
  7. parser.add_argument('pos2')  
  8. parser.add_argument('-o1')  
  9. parser.add_argument('-o2')  
  10. parser.add_argument('pos3', nargs='*')  
  11.   
  12. print sys.argv  
  13. # arg = parser.parse_args(sys.argv[1:])  
  14. arg = parser.parse_known_args(sys.argv[1:])  
  15. print arg  
  16.   
  17. # print parser.print_help()  

假设将上面的代码保存在 test.py 文件中,在命令行中做如下测试:

input:   python test.py a b c -o1 d e -o2 f g h

output: 

['test.py', 'a', 'b', 'c', '-o1', 'd', 'e', '-o2', 'f', 'g', 'h']
(Namespace(o1='d', o2='f', pos1=['a', 'b'], pos2='c', pos3=[]), ['e', 'g', 'h'])


input: python test.py a  -o1 b c  -o2 d e f g h
output: 

['test.py', 'a', '-o1', 'b', 'c', '-o2', 'd', 'e', 'f', 'g', 'h']
(Namespace(o1='b', o2='d', pos1=[], pos2='a', pos3=[]), ['c', 'e', 'f', 'g', 'h'])

input: python test.py -o1 a b c  -o2 d e f g h

output: 

['test.py', '-o1', 'a', 'b', 'c', '-o2', 'd', 'e', 'f', 'g', 'h']
(Namespace(o1='a', o2='d', pos1=['b'], pos2='c', pos3=[]), ['e', 'f', 'g', 'h'])

input: python test.py -o1 a -o2 b c d e f g h

output: 

['test.py', '-o1', 'a', '-o2', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
(Namespace(o1='a', o2='b', pos1=['c', 'd', 'e', 'f', 'g'], pos2='h', pos3=[]), [])

做如上四组测试,传入的参数都一样(唯一不一样的就是位置), 但是得到了不同的结果。

究其原因,这就是 argparse 模块的实现原理。 采用了正则匹配的方式 来解析参数(正则的说法属于个人理解,没有关注源码,如果有误,望更正)

在 add_argument 添加参数规则的时候,我们把带 '-' 的叫做选项参数,不带 '-' 的叫做位置参数。 下面我们以位置参数为例

在上面的代码中 通过 add_argument 添加了 pos1,pos2,pos3 三个位置参数,他们构成的 正则表达式为 A*AA*,其中A*代表匹配0个或多个值。

在测试例子1中的参数列表中,首先遇到位置参数 a b c ,这正好与 A*AA*的模式匹配,即 pos1=[a,b] pos2=c, pos3=[],因为A*AA*是贪婪匹配模式,即尽可能多的得到值,所以pos1=[a,b]而pos3=[]

在测试例子4中的参数列表中,A*AA* 匹配到参数列表中的 c d e f g h, 在贪婪匹配模式下,即可得到 pos1=[c,d,e,f,g], pos2=h, pos3=[]


通过分析上面两个例子,我们只需要记住 argparse 解析参数是根据 add_argument 添加的规则来进行模式匹配。就可以较好的理解解析的结果了!


最后,感谢博文 http://4byte.cn/question/347481/argparse-how-to-handle-variable-number-of-arguments-nargs.html 的分享


posted on   yusisc  阅读(47)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示