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. 阿里云自定义镜像可以免费保存,ECS实例到期后自定义镜像手动快照不会被删除

    阿里云自定义镜像可以免费保存,ECS实例到期后自定义镜像手动快照不会被删除 4. ECS 实例释放后,自定义镜像是否还存在? 存在. 5. ECS 实例释放后,快照是否还存在? 保留手动快照,清除自动 ...

  2. java连接oracle数据库使用SERVICE NAME、SID以及TNSName不同写法

    格式一: 使用ServiceName方式: jdbc:oracle:thin:@//<host>:<port>/<service_name> 例 jdbc:orac ...

  3. 如何干净卸载mysql

    一.在控制面板中卸载mysql软件: 二.卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件,把mysql文件夹也删了: 三.windows+R运行“reged ...

  4. urlopen和urlretrieve

    import urllib import re url = "https://www.duitang.com/search/?kw=%E9%AC%BC%E6%80%AA&type=f ...

  5. POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)

    题目链接:http://poj.org/problem?id=1330 题意:给定一个n个节点的有根树,以及树中的两个节点u,v,求u,v的最近公共祖先. 数据范围:n [2, 10000] 思路:从 ...

  6. Zsh和oh my zsh的安装和使用

    Zsh 兼容 Bash,据传说 99% 的 Bash 操作 和 Zsh 是相同的,默认 CentOS / Ubuntu / Mac 系统用的是 Bash,倒也不是说 Bash 不好,而是说我们有更好的 ...

  7. OpenStack平台上,linux云主机可以使用xshell连接,但是无法xftp连接

    笔者在OpenStack云平台上创建了CentOS6.6的云主机,用了一段时间后,发现xshell可以连接,但是xftp却连接不上. 于是进行伟大的百度操作,检查网络设置.ssh服务设置等,均正常,否 ...

  8. Zynq ZC706 传统方式移植Linux -- 编译u-boot

    我用的是zc706不是zed 基本思路是: 1.安装交叉编译工具(见 https://www.cnblogs.com/idyllcheung/p/10532654.html ) 2.下载xilinx ...

  9. java热加载之springloaded

    https://github.com/spring-projects/spring-loaded/wiki

  10. spring使用@Value标签读取.properties文件的中文乱码问题的解决

    最近测试某个老系统的时候,启动的时候发@Value注入的中文是乱码,文件使用GBK/UTF-8的时候均会出现乱码问题,但是spring配置文件里面注入的占位符并没有这个问题,bean文件设置了file ...