当前位置: 首页 > news >正文

Python 命令行参数和getopt模块详解

1.需求来源

有时候我们需要写一些脚本处理一些任务,可能根据不同的条件输入不同的命令,来完成不同的任务。能不能做到跟linux操作系统一样,看着更高大上一点呢?

答案当然是可以的啦!getopt能满足你的需求

先看个linux 中的系统命令吧:最终目的就是写出类似的脚本。

2.getopt介绍

getopt这个函数 就是用来抽取 sys.argv 获得的用户输入来确定执行步骤。

getopt是个模块,而这个模块里面又有getopt 函数,所以getopt需要这样这样用。

getopt.getopt( [命令行参数列表], "短选项", [长选项列表] )

该函数返回两个值. opts 和args

opts 是一个存有所有选项及其输入值的元组.当输入确定后,这个值不能被修改了.

args 是去除有用的输入以后剩余的部分.

1 import getopt,sys
2 shortargs = 'f:t' #短选项
3 longargs = ['directory-prefix=', 'format', '--f_long='] #长选项
4 opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)
5 print 'opts=',opts
6 print 'args=',args

 

getopt函数的格式是getopt.getopt ( [命令行参数列表], "短选项", [长选项列表] )
短选项名后的冒号(:)表示该选项必须有附加的参数。
长选项名后的等号(=)表示该选项必须有附加的参数。

几种输出结果为:

分清longargs长选项里面的数据,是什么样的必须在前面追加--,不然出异常。例如

正确格式:----f_long='data'

错误格式:--f_long='data'

正确:

错误:

不同的数据参数格式,被捕获的结果不一样:当格式正确的时候被opts捕获,当不是参数格式的时候被args捕获。

选项的写法要求   

  对于短格式,"-"号后面要紧跟一个选项字母。如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,可以用引号。如以下是正确的:
    -o
    -oa
    -obbbb
    -o bbbb
    -o "a b"
  对于长格式,"--"号后面要跟一个单词。如果还有些选项的附加参数,后面要紧跟"=",再加上参数。"="号前后不能有空格。如以下是正确的:

    --help=file1

  而这些是不正确的:
    -- help=file1
    --help =file1
    --help = file1
    --help= file1

3.如何使用getopt进行分析

使用getopt模块分析命令行参数大体上分为三个步骤:

1.导入getopt,sys模块。

2.分析命令行参数。

3.处理结果。

第一步:导入模块

import sys,getopt

第二步:处理方法如下

try:  
    opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])  
except getopt.GetoptError:  
    # print help information and exit: 

解释如下:

1. 处理所使用的函数叫getopt() ,因为是直接使用import 导入的getopt 模块,所以要加上限定getopt 才可以。
2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
3. 使用短格式分析串"ho:" 。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一 个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。
4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。
5. 调用getopt 函数。函数返回两个列表:opts 和args 。opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。
6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。

如上面解释的一个命令行例子为:
'-h -o file --help --output=out file1 file2'
在分析完成后,opts 应该是:
[('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]
而args 则为:
['file1', 'file2']

第三步:主要是对分析出的参数进行判断是否存在,然后再进一步处理。主要的处理模式为:

for o, a in opts:  
    if o in ("-h", "--help"):  
        usage() #处理参数 
        sys.exit()  
    if o in ("-o", "--output"):  
        output = a

使用一个循环,每次从opts 中取出一个两元组,赋给两个变量。o 保存选项参数,a 为附加参数。接着对取出的选项参数进行处理。

实例代码:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 import getopt,sys
 4 
 5 def usage():
 6     print "Usage:%s [-a|-o|-c] [--help|--output] args...." %(sys.argv[0])
 7 
 8 if __name__=='__main__':
 9     try:
10         shortargs = 'f:t'
11         longargs = ['directory-prefix=', 'format', '--f_long=']
12         opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)
13         print '****************opts********************'
14         print 'opts=',opts
15         print '****************args********************'
16         print 'args=',args
17 
18         for opt,arg in opts:
19             if opt in ('-h','--help'):
20                 usage()
21                 sys.exit(1)
22             elif opt in ('--f_long'):
23                 print '--f_long=',opt
24             else:
25                 print '%s====> %s' %(opt,arg)
26     except getopt.GetoptError:
27         print 'getopt error!'
28         usage()
29         sys.exit(1)

 运行结果:

[root@muban1228 test]# python test1.py -f 'test' -t --directory-prefix='aaaaaaa' ----f_long='bbbbb' --format
****************opts********************
opts= [('-f', 'test'), ('-t', ''), ('--directory-prefix', 'aaaaaaa'), ('----f_long', 'bbbbb'), ('--format', '')]
****************args********************
args= []
--f_long= -f
-t====>
--directory-prefix====> aaaaaaa
----f_long====> bbbbb
--format====>

expect类提示:

[root@muban1228 test]# python test1.py -f 'test' -h --directory-prefix='aaaaaaa' ----f_long='bbbbb' --format
getopt error!
Usage:test1.py [-a|-o|-c] [--help|--output] args....

参考文档:http://andylin02.iteye.com/blog/845355

转载于:https://www.cnblogs.com/chushiyaoyue/p/5380022.html

相关文章:

  • 图的广度优先搜索(BFS)
  • Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引
  • svn服务器的搭建
  • Atitit.获取某个服务 网络邻居列表 解决方案
  • 通过Android源代码分析startActivity()过程(下)
  • 转:MyBatis学习总结(Mybatis总结精华文章)
  • 【LINUX 学习】使用find和xargs[转摘自《shell编程和unix命令》]
  • 关于PowerBuilder 9.0中如何修改项目工程名字
  • MapReduce实现TopK
  • toolBar和toolBarItem的定制
  • WebService学习总结(2)——WebService是什么?
  • centos7 下的 KVM
  • subline的node.js安装和快捷键
  • 新建文件夹及其他
  • 简单实现图片验证码
  • C语言笔记(第一章:C语言编程)
  • ES6 学习笔记(一)let,const和解构赋值
  • extract-text-webpack-plugin用法
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascript Math对象和Date对象常用方法详解
  • LeetCode29.两数相除 JavaScript
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Linux下的乱码问题
  • ng6--错误信息小结(持续更新)
  • Python学习笔记 字符串拼接
  • python学习笔记-类对象的信息
  • 对象引论
  • 排序算法之--选择排序
  • 思否第一天
  • 写代码的正确姿势
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 从如何停掉 Promise 链说起
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • (1)(1.9) MSP (version 4.2)
  • (11)MATLAB PCA+SVM 人脸识别
  • (c语言)strcpy函数用法
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四) 虚拟摄像头vivi体验
  • (四)Android布局类型(线性布局LinearLayout)
  • . NET自动找可写目录
  • .bashrc在哪里,alias妙用
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 5种线程安全集合
  • .net core 依赖注入的基本用发
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Core引入性能分析引导优化
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET MVC第三章、三种传值方式
  • .Net 高效开发之不可错过的实用工具
  • .NET6 命令行启动及发布单个Exe文件