Python解析命令行读取参数--argparse模块使用方法

 更新时间:2018年01月23日 15:48:35   投稿:mdxy-dxy  
这篇文章主要介绍了Python解析命令行读取参数--argparse模块使用方法,需要的朋友可以参考下

在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。万能的python就自带了argprase包使得这一工作变得简单而规范。PS:optparse包是类似的功能,只不过写起来更麻烦一些。

如果脚本很简单或临时使用,没有多个复杂的参数选项,可以直接利用sys.argv将脚本后的参数依次读取(读进来的默认是字符串格式)。比如如下名为test.py的脚本:

import sys
print "Input argument is %s" %(sys.argv[0])

在shell脚本中运行python test.py help可以得到Input argument is help的结果。

1) 一般形式

但是大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的。

同样用名为test.py的脚本举个栗子:

import argparse

parser = argparse.ArgumentParser(description="your script description")      # description参数可以用于插入描述脚本用途的信息,可以为空
parser.add_argument('--verbose', '-v', action='store_true', help='verbose mode')  # 添加--verbose标签,标签别名可以为-v,这里action的意思是当读取的参数中出现--verbose/-v的时候
                                          # 参数字典的verbose建对应的值为True,而help参数用于描述--verbose参数的用途或意义。
args = parser.parse_args()                             # 将变量以标签-值的字典形式存入args字典
if args.verbose:
  print "Verbose mode on!"
else:
  print "Verbose mode off!"

运行python test.py后面跟了--verbose/-v的时候会输出前者,如果什么都没有会输出后者。如果输入了--verbose/-v以外的参数则会报错:unrecognized arguments
稍微提一下,action参数表示值赋予键的方式,这里用到的是bool类型;如果是'count'表示将--verbose标签出现的次数作为verbose的值;'append'表示将每次出现的该便签后的值都存入同一个数组再赋值。(嘛,一般后面两种用的比较少就不多说了)
PS:--help标签在使用argparse模块时会自动创建,因此一般情况不需要我们主动定义帮助信息。

$ python test.py --help
usage: test.py [-h] [--verbose]

your script description

optional arguments:
  -h, --help    show this help message and exit
  --verbose, -v   verbose mode 

2) 必需参数

这种模式用于确保某些必需的参数有输入。

parser.add_argument('--verbose', required=True, type=int)

required标签就是说--verbose参数是必需的,并且类型为int,输入别的类型会报错。

3)位置参数(positional arguments)

位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同。

parser.add_argument('filename')  # 输入的第一个参数赋予名为filename的键
args = parser.parse_args()
print "Read in %s" %(args.filename)

输入python test.py test.txt则会输出Read in test.txt

此外,可以用nargs参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。
parser.add_argument('num', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+'表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。)

比如用:

parser.add_argument('filename')
parser.add_argument('num', nargs='*)

就可以运行python test.py text.txt 1 2

由于没有标签,所以用位置参数的时候需要比较小心。

4)输入类型

之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。

parser.add_argument('file', type=argparser.FileType('r'))  # 读取文件
args = parser.parse_args()
for line in args.file:
  print line.strip()

5)参数默认值

一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。

parser.add_argument('filename', default='text.txt')

这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了。

6)候选参数选择

表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:

parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])

参考:

https://mkaz.tech/python-argparse-cookbook.html

https://docs.python.org/2/howto/argparse.html

以下是其他网友的补充:

一、简介:

argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数,例如python parseTest.py input.txt output.txt --user=name --port=8080。

二、使用步骤:

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

解释:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用,下面简单说明一下步骤2和3。

三、方法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)

这些参数都有默认值,当调用parser.print_help()或者运行程序时由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数,如上。

四、方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

其中:

name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None

nargs:命令行参数的个数,一般使用通配符表示,其中,'?'表示只用一个,'*'表示0到多个,'+'表示至少一个

default:默认值

type:参数的类型,默认是字符串string类型,还有float、int等类型

help:和ArgumentParser方法中的参数作用相似,出现的场合也一致

最常用的地方就是这些,其他的可以参考官方文档。下面给出一个例子,基本包括了常见的情形:

import argparse
 
def parse_args():
  description = usage: %prog [options] poetry-file
 
This is the Slow Poetry Server, blocking edition.
Run it like this:
 
 python slowpoetry.py <path-to-poetry-file>
 
If you are in the base directory of the twisted-intro package,
you could run it like this:
 
 python blocking-server/slowpoetry.py poetry/ecstasy.txt
 
to serve up John Donne's Ecstasy, which I know you want to do.
 
 
  parser = argparse.ArgumentParser(description = description)
   
  help = The addresses to connect.
  parser.add_argument('addresses',nargs = '*',help = help)
 
  help = The filename to operate on.Default is poetry/ecstasy.txt
  parser.add_argument('filename',help=help)
 
  help = The port to listen on. Default to a random available port.
  parser.add_argument('-p',--port', type=int, help=help)
 
  help = The interface to listen on. Default is localhost.
  parser.add_argument('--iface', help=help, default='localhost')
 
  help = The number of seconds between sending bytes.
  parser.add_argument('--delay', type=float, help=help, default=.7)
 
  help = The number of bytes to send at a time.
  parser.add_argument('--bytes', type=int, help=help, default=10)
 
  args = parser.parse_args();
  return args
 
if __name__ == '__main__':
  args = parse_args()
   
  for address in args.addresses:
    print 'The address is : %s .' % address
   
  print 'The filename is : %s .' % args.filename
  print 'The port is : %d.' % args.port
  print 'The interface is : %s.' % args.iface
  print 'The number of seconds between sending bytes : %f'% args.delay
  print 'The number of bytes to send at a time : %d.' % args.bytes</path-to-poetry-file>

运行该脚本:python test.py --port 10000 --delay 1.2 127.0.0.1 172.16.55.67 poetry/ecstasy.txt

输出为:

The address is : 127.0.0.1 .
The address is : 172.16.55.67 .
The filename is : poetry/ecstasy.txt .
The port is : 10000.
The interface is : localhost.
The number of seconds between sending bytes : 1.200000
The number of bytes to send at a time : 10.

相关文章

  • Python中常见的内置函数使用讲解

    Python中常见的内置函数使用讲解

    Python作为一种强大的编程语言,提供了丰富的内置函数,用于各种常见操作,本文将详细介绍Python中常见的内置函数的用法,需要的可以参考下
    2023-08-08
  • Python条件分支 if 语句全讲解(一文掌握)

    Python条件分支 if 语句全讲解(一文掌握)

    在Python编程中,布尔运算符有明确的优先级顺序,影响代码逻辑判断,从高到低依次是:括号()、not、and、or,括号用于明确运算顺序,not具有次高优先级,影响单个布尔值,and和or则根据优先级顺序结合布尔值,正确理解和应用这些优先级对于编写有效和准确的条件语句至关重要
    2024-10-10
  • Python分析最近大火的网剧《隐秘的角落》

    Python分析最近大火的网剧《隐秘的角落》

    这篇文章主要介绍了Python分析最近大火的网剧《隐秘的角落》,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 对PyQt5的输入对话框使用(QInputDialog)详解

    对PyQt5的输入对话框使用(QInputDialog)详解

    今天小编就为大家分享一篇对PyQt5的输入对话框使用(QInputDialog)详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 对于Python异常处理慎用“except:pass”建议

    对于Python异常处理慎用“except:pass”建议

    这篇文章主要介绍了对于Python异常处理方法的建议,摘选自StackOverflow上的热门问题的回答,阐述了except:pass的使用时需要注意的地方,需要的朋友可以参考下
    2015-04-04
  • Python图像灰度变换及图像数组操作

    Python图像灰度变换及图像数组操作

    这篇文章主要介绍了Python图像灰度变换及图像数组操作的相关资料,需要的朋友可以参考下
    2016-01-01
  • 基于Python制作公交车站查询系统

    基于Python制作公交车站查询系统

    这篇文章主要介绍了如何利用Python制作一个简单的公交车站查询系统。文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
    2022-01-01
  • python 2.7.14安装图文教程

    python 2.7.14安装图文教程

    这篇文章主要为大家详细介绍了python 2.7.14安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 如何在C++中调用Python

    如何在C++中调用Python

    虽然现在Python编程语言十分的火爆,但是实际上非要用一门语言去完成所有的任务,并不是说不可以,而是不合适。在一些特定的、对于性能要求比较高的场景,还是需要用到传统的C++来进行编程的。本文将用C++的代码去调用Python函数中实现的一些功能
    2021-05-05
  • Python时间的精准正则匹配方法分析

    Python时间的精准正则匹配方法分析

    这篇文章主要介绍了Python时间的精准正则匹配方法,结合实例形式对比分析了Python针对时间格式相关正则匹配技巧,需要的朋友可以参考下
    2017-08-08

最新评论