https://blog.csdn.net/lis_12/article/details/54618868

Python 详解命令行解析 - argparse

sys.argv

适合解析简单的命令行

filename = arg_sys.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
需要模块:sys
参数个数:len(sys.argv)
文件名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[2]
......
'''
import sys
print "file = ", sys.argv[0]
for i in range(1, len(sys.argv)):
print "parameter%s = %s"%(i, sys.argv[i])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在dos输入python arg_sys.py 1 2 3 4 5

why choice argparse ?

2.7之后python不再对optparse模块进行扩展,推荐使用argparse模块对命令行进行解析。

来自stackoverflow的说明

As of 2.7, optparse is deprecated, and will hopefully go away in the future.

argparse is better for all the reasons listed on its original page (http://code.google.com/p/argparse/):

  • handling positional arguments
  • supporting sub-commands
  • allowing alternative option prefixes like + and /
  • handling zero-or-more and one-or-more style arguments
  • producing more informative usage messages
  • providing a much simpler interface for custom types and actions

More information is also in PEP 389, which is the vehicle by which argparse made it into the standard library.

创建解析器 - ArgumentParser

import argparse
parser = argparse.ArgumentParser()
  • 1
  • 2
class ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
  • 1

创建一个ArgumentParser实例,ArgumentParser的参数都为关键字参数。

prog :文件名,默认为sys.argv[0],用来在help信息中描述程序的名称。

usage :描述程序用途的字符串

description :help信息前显示的信息

epilog :help信息之后显示的信息

>>> parser = argparse.ArgumentParser(prog='my - program', usage='%(prog)s [options] usage',description = 'my - description',epilog = 'my - epilog')
>>> parser.print_help()
usage: my - program [options] usage my - description optional arguments:
-h, --help show this help message and exit my - epilog
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

parents :由ArgumentParser对象组成的列表,它们的arguments选项会被包含到新ArgumentParser对象中。(类似于继承)

formatter_class :help信息输出的格式,为了美观…

prefix_chars :参数前缀,默认为’-‘(最好不要修改)

>>> parser = argparse.ArgumentParser(prefix_chars='+')
>>> parser.add_argument('+x')
>>> parser.add_argument('++y')
>>> parser.parse_args('+x 1 ++y 2'.split())
Namespace(x='1', y='2')
>>> parser.parse_args('-x 2'.split())
usage: [+h] [+x X] [++y Y]
: error: unrecognized arguments: -x 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

fromfile_prefix_chars :前缀字符,放在文件名之前

>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'tmp', '@args.txt'])
Namespace(f='bar')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当参数过多时,可以将参数放到文件中读取,例子中parser.parse_args([‘-f’, ‘foo’, ‘@args.txt’])解析时会从文件args.txt读取,相当于 [‘-f’, ‘foo’, ‘-f’, ‘bar’]

conflict_handler :解决冲突的策略,默认情况下冲突会发生错误,(最好不要修改)

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

add_help :是否增加-h/-help选项 (默认为True),一般help信息都是必须的。设为False时,help信息里面不再显示-h –help信息

argument_default: - (default: None)设置一个全局的选项的缺省值,一般每个选项单独设置,基本没用

添加参数选项 - add_argument

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • 1

name or flags :参数有两种,可选参数和位置参数。

  1. 添加可选参数

    >>> parser.add_argument('-f', '--foo')
    • 1
  2. 添加位置参数

    >>> parser.add_argument('bar')
    • 1

parse_args()运行时,默认会用’-‘来认证可选参数,剩下的即为位置参数。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('name')
>>> parser.add_argument('-a', '--age')
>>> parser.parse_args(['xiaoming'])
Namespace(age=None, name='xiaoming')
>>> parser.parse_args(['xiaoming','-a','123'])
Namespace(age='123', name='xiaoming')
>>> parser.parse_args(['-a','123'])
usage: [-h] [-a AGE] name
: error: too few arguments
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解析时缺少位置参数就会报错了

action: 默认为store

  1. store_const:值存放在const中:

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='store_const', const=42)
    >>> parser.parse_args('--foo'.split())
    Namespace(foo=42)
    • 1
    • 2
    • 3
    • 4
  2. store_true和store_false:值存为True或False

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('-x', action='store_true')
    >>> parser.add_argument('-y', action='store_false')
    >>> parser.add_argument('-z', action='store_false')
    >>> parser.parse_args('-x -y'.split())
    Namespace(x=True, y=False, z=True)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. append:存为列表,可以有多个参数

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--l', action='append')
    >>> parser.parse_args('--l 1 --l 2'.split())
    Namespace(l=['1', '2'])
    • 1
    • 2
    • 3
    • 4
  4. append_const:存为列表,会根据const关键参数进行添加:

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--str', dest='types', action='append_const', const=str)
    >>> parser.add_argument('--int', dest='types', action='append_const', const=int)
    >>> parser.parse_args('--str --int --str --int'.split())
    Namespace(l=None, types=[<type 'str'>, <type 'int'>, <type 'str'>, <type 'int'>])
    • 1
    • 2
    • 3
    • 4
    • 5
  5. count:统计参数出现的次数

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--counte', '-c', action='count')
    >>> parser.parse_args('-cccc'.split())
    Namespace(counte=4)
    • 1
    • 2
    • 3
    • 4
  6. help: help信息

  7. version:版本

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--version', action='version', version='version 2.0')
    >>> parser.parse_args(['--version'])
    version 2.0
    • 1
    • 2
    • 3
    • 4

metaver:帮助信息中显示的参数名称

nargs: 参数的数量

  1. 值可以为整数N(N个),*(任意多个,可以为0个),+(一个或更多),有点像正则表达式啊

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('-x', nargs='*')
    >>> parser.add_argument('-y', nargs='*')
    >>> parser.add_argument('-z', nargs='*')
    >>> parser.parse_args('1 2 -x 3 4 -y 5 6'.split())
    Namespace(x=['3', '4'], y=['5', '6'], z=['1', '2'])
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  2. 值为?时,首先从命令行获得参数,如果有-y后面没加参数,则从const中取值,如果没有-y,则从default中取值

    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('x', nargs='?',default='default')
    >>> parser.add_argument('-y', nargs='?',const='const', default='default')
    >>> parser.parse_args('1 -y 2'.split())
    Namespace(x='1', y='2')
    >>> parser.parse_args('1 -y'.split())
    Namespace(x='1', y='const')
    >>> parser.parse_args([])
    Namespace(x='default', y='default')
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

const :保存一个常量

default :默认值

type :参数类型,默认为str

choices :设置参数值的范围,如果choices中的类型不是字符串,记得指定type

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x', type=int, choices=range(1, 4))
>>> parser.parse_args(['3'])
Namespace(x=3)
>>> parser.parse_args(['4'])
usage: [-h] {1,2,3}
: error: argument x: invalid choice: 4 (choose from 1, 2, 3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

required :该选项是否必选,默认为True

dest :参数名

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='f_name')
>>> parser.parse_args('--foo XXX'.split())
Namespace(f_name='XXX')
  • 1
  • 2
  • 3
  • 4

解析参数

像名称空间一样使用即可

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('x')
>>> a = parser.parse_args(['1'])
>>> a
Namespace(x='1')
>>> type(a)
<class 'argparse.Namespace'>
>>> a.x
'1'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

example

filename = argv_argparse.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import argparse def cmd():
args = argparse.ArgumentParser(description = 'Personal Information ',epilog = 'Information end ')
#必写属性,第一位
args.add_argument("name", type = str, help = "Your name")
#必写属性,第二位
args.add_argument("birth", type = str, help = "birthday")
#可选属性,默认为None
args.add_argument("-r",'--race', type = str, dest = "race", help = u"民族")
#可选属性,默认为0,范围必须在0~150
args.add_argument("-a", "--age", type = int, dest = "age", help = "Your age", default = 0, choices=range(150))
#可选属性,默认为male
args.add_argument('-g',"--gender", type = str, dest = "gender", help = 'Your gender', default = 'male', choices=['male', 'female'])
#可选属性,默认为None,-p后可接多个参数
args.add_argument("-p","--parent",type = str, dest = 'parent', help = "Your parent", default = "None", nargs = '*')
#可选属性,默认为None,-o后可接多个参数
args.add_argument("-o","--other", type = str, dest = 'other', help = "other Information",required = False,nargs = '*') args = args.parse_args()#返回一个命名空间,如果想要使用变量,可用args.attr
print "argparse.args=",args,type(args)
print 'name = %s'%args.name
d = args.__dict__
for key,value in d.iteritems():
print '%s = %s'%(key,value) if __name__=="__main__":
cmd()
  • 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

dos输入命令示例:

python argv_argparse.py -h

python argv_argparse.py xiaoming 1991.11.11

python argv_argparse.py xiaoming 1991.11.11 -p xiaohong xiaohei -a 25 -r han -g female -o 1 2 3 4 5 6


转载请标明出处,原文地址(http://blog.csdn.net/lis_12/article/details/54618868).

如果觉得本文对您有帮助,请点击支持一下,您的支持是我写作最大的动力,谢谢。

参考网址

  1. https://docs.python.org/2/library/argparse.html#module-argparse
  2. http://www.jb51.net/article/67158.htm
  3. http://stackoverflow.com/questions/3217673/why-use-argparse-rather-than-optparse
  4. http://www.cnblogs.com/linxiyue/p/3908623.html?utm_source=tuicool&utm_medium=referral

33 Python 详解命令解析 - argparse--更加详细--转载的更多相关文章

  1. [转载]python 详解re模块

    原文地址:python 详解re模块作者:Rocky 正则表达式的元字符有. ^ $ * ? { [ ] | ( ) .表示任意字符 []用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字 ...

  2. Android 6.0 RK3288 ROM编译详解+命令详解【转】

    本文转载自:http://blog.csdn.net/MLQ8087/article/details/58607692 Android 6.0 RK3288 ROM编译详解+命令详解 原创 2017年 ...

  3. Linux权限详解 命令之 chmod:修改权限

    权限简介 Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功. Linux下文件的权限类型一般包括读,写,执行.对应字母为 r.w.x. Li ...

  4. XML文件详解以及解析

    转自:https://blog.csdn.net/com_ma/article/details/73277535 一.xml基础详解: 1.概述: xml:即可扩展标记语言,xml是互联网数据传输的重 ...

  5. 详解JMeter函数和变量(转载)

    详解JMeter函数和变量(1) JMeter函数可以被认为是某种特殊的变量,它们可以被采样器或者其他测试元件所引用.函数调用的语法如下: ${__functionName(var1,var2,var ...

  6. HTTP协议详解(真的很经典)(转载)

    HTTP协议详解(真的很经典):http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 引言 HTTP是一个属于应用层的面向对象的协 ...

  7. 【机器学习详解】SMO算法剖析(转载)

    [机器学习详解]SMO算法剖析 转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51227754 CSDN−勿在浮沙筑高台 本文力 ...

  8. Linux内核源码详解——命令篇之iostat[zz]

    本文主要分析了Linux的iostat命令的源码,iostat的主要功能见博客:性能测试进阶指南——基础篇之磁盘IO iostat源码共563行,应该算是Linux系统命令代码比较少的了.源代码中主要 ...

  9. python详解json模块

    我们在做工作中经常会使用到json模块,今天就简单介绍下json模块 什么是json JSON ,全称为JavaScript Object Notation, 也就是JavaScript 对象标记,它 ...

随机推荐

  1. 分页的模块layui

    //调用分页模块 var laypage = layui.laypage; //分页的配置项 laypage.render({ elem:"page",//(指向存放分页的容器,值 ...

  2. 每日linux命令学习-rpm命令

    rpm命令 rpm是一款强大的Redhat软件包管理工具,可创建.安装.查询.验证.升级和卸载每个软件包,软件包是存储文件,包括需要安装的文件和名称.版本.说明等报信息. rpm默认支持7种操作模式, ...

  3. eval & sleep

    ltp-ddt can_loopback source 'functions.sh'; interface='can0'; bitrate=; do_cmd "do_can_loopback ...

  4. MySQL5.7 的新特点

    1.安全性 MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有一些重要的改变. mysql.user表结构升级 MySQL5.7用户表my ...

  5. maven执行单元测试失败后,继续生成Jacoco&Sonar报告

    为保证生成单元测试覆盖 sonarqube或者jacoco与maven集成时,如果pom文件配置了sonarqube或者Jacoco的相关配置, 那么在pom文件所在目录执行mvn clean ins ...

  6. windows模糊查询指定进程是否存在

    习惯的查询 wmic process | findStr /i "**" /i 忽略大小写 我查考的链接 常用批处理命令总结3之Find和FindStr

  7. Linux维护常用命令

    1.查看Linux占用内存/CPU最多的进程 可以使用以下命令查使用内存最多的10个进程 #ps -aux | sort -k4nr | head -n 10可以使用以下命令查使用CPU最多的10个进 ...

  8. topcoder srm 713 div1

    problem1 link 如果$a^{b}=c^{d}$,那么一定存在$t,x,y$使得$a=t^{x},c=t^{y}$.一旦$t,x,y$确定,那么可以直接计算出二元组$b,d$有多少.对于$t ...

  9. ODAC(V9.5.15) 学习笔记(三)TOraSession(2)

    2. 事务相关 名称 类型 说明 AutoCommit Boolean 是否自动提交事务 注意:只有当TOraSession和TOraQuery的AutoCommit都为True时才对每个数据库操作自 ...

  10. Python3基础 response.info 服务器返回的header信息

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...