当前位置:首页 > 编程教程 > Python技术文章 > Python命令行解析模块详解

Python命令行解析模块代码实例

  • 发布时间:
  • 作者:码农之家
  • 点击:76

这篇文章主要知识点是关于python、命令行解析、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

ArcGIS下的Python编程
  • 类型:编程设计大小:144 MB格式:PDF作者:包瑞清
立即下载

Python命令行解析模块详解

本文研究的主要是Python命令行解析模块的相关内容,具体如下。

Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块。下面就解读下这两种解析器。

getopt模块

这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:]。它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数)。这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError)。

这里重点介绍getopt.getopt()这个函数。

函数原型:getopt.getopt(args, options[, long_options])

这个函数有三个参数:

  • args:脚本要解析的命令行参数;
  • options:命令行短选项,如果指定的短选项后面需要跟参数的话,要在相应短选项后面加“:”,如e:;
  • long_options:命令行长选项,这个参数是可选的。如果指定的长选项后面要跟参数的话,要在相应长选项后面加上“=”,如conding=;

当给定的命令行参数解析不了的话,就会抛出GetoptError异常。

函数的返回值包含两个元素:

  • 第一个元素是一个(option,value)元组对。Option是解析的参数,value是对应参数的值;
  • 第二个元素是脚本不需要执行的参数列表。也就是这些参数是多余的;

下面看几个Demo:

短选项:

>>> importgetopt
>>> args='-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1','a2']
>>> optlist, args= getopt.getopt(args,'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'),('-d', 'bar')]
>>> args
['a1', 'a2']

长选项:

>>> s='--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args= s.split()
>>> args
['--condition=foo', '--testing','--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args= getopt.getopt(args,'x', [
...   'condition=','output-file=','testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''),('--output-file', 'abc.def'), ('-x', '')]
>>> args
['a1', 'a2']

在脚本当中经典的应用实例:

importgetopt,sys
 
defmain():
  try:
    opts, args = getopt.getopt(sys.argv[1:],"ho:v", ["help","output="])
  except getopt.GetoptErroras err:
    # print help information and exit:
    printstr(err) # will print something like "option -a not recognized"
    usage()
    sys.exit(2)
  output =None
  verbose =False
  for o, a in opts:
    if o =="-v":
      verbose =True
    elif o in ("-h","--help"):
      usage()
      sys.exit()
    elif o in ("-o","--output"):
      output = a
    else:
      assertFalse,"unhandled option"
  # ...
 
if __name__ =="__main__":
  main()

argparse模块

argparse模块使得编写用户友好的命令行接口非常容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。
使用argparse模块一般需要三个步骤:

1. 创建一个解析器

使用argparse的第一步是创建一个ArgumentParser对象:

>>> parser= argparse.ArgumentParser()

ArgumentParser对象会保存把命令行解析成Python数据类型所需要的所有信息。

2. 添加参数

通过调用add_argument()方法向ArgumentParser添加程序的参数信息。通常情况下,这些信息告诉ArgumentParser如何接收命令行上的字符串并将它们转换成对象。这些信息被保存下来并在调用parse_args()时用到。例如:

>>> parser.add_argument('--name', help='username')
>>> parser.add_argument('--pass', help='password ')

接下来,调用parse_args()返回的对象将带有两个属性,name和pass。分别保存着用户名与密码。

3. 解析参数

ArgumentParser通过parse_args()方法解析参数。它将检查命令行,把每个参数转换成恰当的类型并采取恰当的动作。在大部分情况下,这意味着将从命令行中解析出来的属性建立一个简单的 Namespace对象。

>>> argments = parser.parse_args(['--name','li','--pass','si'])

在脚本中,parse_args() 调用一般不带参数,ArgumentParser 将根据sys.argv自动确定命令行参数。

ArgumentParser 对象

class argparse.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)

创建一个新的argmentParserr对象。所有的参数应该以关键字参数传递。下面有对每个参数各自详细的描述,但是简短地讲它们是:

  • prog - 程序的名字(默认:sys.argv[0])
  • useage - 描述程序用法的字符串(默认:从解析器的参数生成)
  • description - 参数帮助信息之前的文本(默认:空)
  • epilog- 参数帮助信息之后的文本(默认:空)
  • parents - ArgmentParser 对象的一个列表,这些对象的参数应该包括进去
  • ormatter_class - 定制化帮助信息的类
  • prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
  • fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
  • argument_default - 参数的全局默认值(默认:None)
  • conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
  • add_help - 给解析器添加-h/–help 选项(默认:True)

add_argument() 方法

ArgumentParser.add_argument(nameor flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][,metavar][, dest])

定义应该如何解析一个命令行参数。下面每个参数有它们自己详细的描述,简单地讲它们是:

  • name or flags- 选项字符串的名字或者列表,例如foo 或者-f, --foo。
  • action - 在命令行遇到该参数时采取的基本动作类型。
  • nargs - 应该读取的命令行参数数目。
  • const- 某些action和nargs选项要求的常数值。
  • default - 如果命令行中没有出现该参数时的默认值。
  • type- 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 该命令行选项是否可以省略(只针对可选参数)。
  • help - 参数的简短描述。
  • metavar - 参数在帮助信息中的名字。
  • dest - 给parse_args()返回的对象要添加的属性名称。

总结

以上就是本文关于Python命令行解析模块详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Python 相关电子书
学习笔记
网友NO.725241

Python如何实现Zabbix-API监控(附代码)

本篇文章给大家带来的内容是关于Python如何实现Zabbix-API监控(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 做运维的朋友应该知道,公司IDC机房经常有上架、下架、报修和报废的服务器。如果服务器数量很多的时候很容易造成监控遗漏。 大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统)集成在一起,当上架一台新机器的时候CMDB里面会记录相关的信息,Zabbix根据CMDB里面信息自动Link相关的模块,添加|删除监控。很多小的公司没有资产管理系统,但作为监控的负责人应该每天知道上架了哪些新的机器,确保能添加到Zabbix监控里面。 首先给大家说一下脚本思路: 1)通过Nmap工具扫描网段,扫描出已经使用的IP地址。 2)通过Nmap检测已经扫描IP的3389或者22端口是否开放,可以判断那些事windows机器,那……

网友NO.507745

Python3.6中Twisted模块安装的问题与解决

发现问题 今天准备学习爬虫的scrapy模块,在这之前需要安装许多别的模块,Twisted就是其一 一开始想着直接用pycharm来安装就行了,没想到安装了一会就报错了,如下 后来就换到命令提示符来安装,在官网发现直接pip安装就行了 pip install Twisted 当我以为一切顺利的时候,又报错了,还是相同的错误。(WTF!!) 好吧,然后上网了找了一下,发现很多人都出现类似问题,说是版本问题。 解决方法 于是我就直接在https://www.lfd.uci.edu/~gohlke/pythonlibs/找到twisted,下载 发现64位安装失败 pip install Twisted-18.9.0-cp36-cp36m-win_amd64.whl 但是32位安装成功 pip install Twisted-18.9.0-cp36-cp36m-win32.whl 然后我就明白了出现的这个安装问题就是Python位数的问题,32位就下32位,64位就下64位,就这么简单,o(╥﹏╥)o 果然新手还是太嫩了,呵呵呵,安装时就已经把问题说明了,奈何六级没过……

网友NO.412745

python实现梯度下降算法

梯度下降(Gradient Descent)算法是机器学习中使用非常广泛的优化算法。当前流行的机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现。 本文主要以线性回归算法损失函数求极小值来说明如何使用梯度下降算法并给出python实现。若有不正确的地方,希望读者能指出。 梯度下降 梯度下降原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快。 在线性回归算法中,损失函数为 在求极小值时,在数据量很小的时候,可以使用矩阵求逆的方式求最优的θ值。但当数据量和特征值非常大,例如几万甚至上亿时,使用矩阵求逆根本就不现实。而梯度下降法就是很好的一个选择了。 使用梯度下降算法的 步骤 : 1)对θ赋初始值,这个值可以是随机的,也可以让θ是一个全零的向量。 2)改变θ的值,……

网友NO.502323

Python如何删除字符串中所有空格

在Python中删除字符串中所有空格有:使用replace()函数、使用split()函数+join()函数、使用Python正则表达式。下面本篇文章就来具体介绍一下这些方法,希望对大家有所帮助。【相关视频教程推荐:Python教程】 使用replace()函数 我们可以使用replace()函数,把所有的空格( )替换为() def remove(string): return string.replace( , ); string = ' H E L L O ! ';print(原字符串:+string) ;print(\n新字符串:+remove(string)) ; 输出: 使用split()函数+join()函数 split()函数会通过指定分隔符对字符串进行切片,返回分割后的字符串的所有单字符列表。然后,我们使用join()函数迭代连接这些字符。 def remove(string): return .join(string.split());string = 'w o r l d ';print(原字符串:+string) ;print(\n新字符串:+remove(string)) ; 输出: 使用Python正则表达式 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模……

网友NO.259742

Python扩展内置类型的实现方法分析

这篇文章主要介绍了Python实现扩展内置类型的方法,结合实例形式分析了Python嵌入内置类型扩展及子类方式扩展的具体实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现扩展内置类型的方法。分享给大家供大家参考,具体如下: 简介 除了实现新的类型的对象方式外,有时我们也可以通过扩展Python内置类型,从而支持其它类型的数据结构,比如为列表增加队列的插入和删除的方法。本文针对此问题,结合实现集合功能的实例,介绍了扩展Python内置类型的两种方法:通过嵌入内置类型来扩展类型和通过子类方式扩展类型。 通过嵌入内置类型扩展 下面例子通过将list对象作为嵌入类型,实现集合对象,并增加了一下运算符重载。这个类知识包装了Python的列表,以及附加的集合运算。 class Set: def __init__(self, value=[]): # Constructor self.data = [] # Manages a list……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com