一、说明

在学C语言的时候就知道可以通过argc获取命令行参数个数,可以通过argv获取具体参数。但自己写的程序获取到的参数一是没有键值形式二是写的参数不能乱序,和系统命令不太一样。

再往后点知道有getopt这个东西,但印象中尝试理解其用法很多次都没什么结果;最近又越来多写程序,再次感觉很有必要掌握。

这里以Python3为例演示getopt,python感觉就是C的封装,C的getopt应该也类似。

二、程序代码

此程序中设置-h/-n/-p三个选项,-h不带值-n和-p带值;三个参数设置等价长格式--help/--name/--profession。

程序通过sys.argv[1:]来获取所有待解析参数,然后传到getopt进行解析,更多说明见代码注释。

import getopt
import sys class GetoptTest:
def __init__(self,argv):
try:
# 第一个参数argv----传过来的要解析的参数数组。形如['-n', 'ls', '-p', 'programmer']
# 第二个参数"hn:p:"----用于向getopt注册短格式。没有:表示该参数不带值,有:表示下一参数为该参数的值
# 第三个参数[]----用于向getopt注册长格式。没有=表示该参数不带值,有=表示=号后边为其值(如果没有=号就以下一个参数为其值)
# 第三个参数[]----[]不是可选的意思,这里是代码,[]表示该参数是个数组
# opts----以元组形式存放解析出的参数。形如[('-n', 'ls'), ('-p', 'programmer'), ('-h', '')]
# args----以数组形式存放按所有注册的格式未能解析参数
opts, args = getopt.getopt(argv, "hn:p:", ["help", "name=", "profession="])
print(f"parsed argv: opts----{opts} args----{args}")
except getopt.GetoptError:
# 参数不符合注册格式要求报错
print("parameter format error")
self.usage()
sys.exit(2) user_name = ""
user_profession = ""
# 遍历所有元组
# getopt只会严格按照注册的格式解析参数,而不理解哪个短格式与哪个长格式等价,等价是我们这里设定短格式和长格式用同一响应造成的
# 也就是说getopt并不理解-n和--name等价,他有-n就解析-n有--name就解析--name,两个都有就两个都解析。-n和--name等价是因为我们对这两个参数用同样的代码进行处理。
# 比如执行python getopt_test.py -n ls --name=root,解析出的就是[('-n', 'ls'), ('--name', 'root')]
for opt, arg in opts:
# -h与--help等价
if opt in ("-h","--help"):
self.usage()
sys.exit()
# -n与--name等价
elif opt in ("-n","--name"):
user_name = arg
# -p与--profession等价
elif opt in ("-p","--profession"):
user_profession = arg
print(f"you are {user_profession} {user_name}!") def usage(self):
print("getopt_test version 1.0")
print("-h print this message")
print("-n <your name> equ --name")
print("-p <your profession> equ --profession") if __name__ == "__main__":
# 系统参数可通过sys.argv[index]来获取,sys.argv[0]是本身文件名
argv = sys.argv[1:]
print(f"will parse argv: {argv}")
# sys.argv[index]武断地以空格来划分参数,并不能区分选项和选项值
# sys.argv[index]不能乱序,取第一个参数为用户名,就必须在第一个参数输入用户名,不能在第二或别的地方输
# 我们使用getopt模块来解决这两个问题
para_test_obj = GetoptTest(argv)

三、运行截图

下图中依次以以下四种形式运行程序,观察getopt解析前后参数可对getopt有更直观理解

python getopt_test.py -h
python getopt_test.py -n ls -p programmer
python getopt_test.py -n ls -p programmer --name=lsx
python getopt_test.py -n ls -p programmer --name=lsx other1 other2

参考:

http://www.runoob.com/python3/python3-command-line-arguments.html

Python3+getopt解析命令行参数的更多相关文章

  1. getopt解析命令行参数一例:汇集多个服务器的日志

    高效工作的一个诀窍就是尽可能自动化, 简便化. 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 pssh: pssh -i -h api_hangzhou.iplist " ...

  2. 【转】getopt分析命令行参数

    (一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个 ...

  3. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  4. C语言中使用库函数解析命令行参数

    在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...

  5. 【python3基础】命令行参数及 argparse

    目录 命令行参数及 argparse 包 argparse 传递 bool 参数错误做法 argparse 传递 bool 参数正确做法 1 argparse 传递 bool 参数正确做法 2 Ref ...

  6. Windows下解析命令行参数

    linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...

  7. boost之program_options库,解析命令行参数、读取配置文件

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  8. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  9. linux 中解析命令行参数(getopt_long用法)

    linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...

随机推荐

  1. SLAM领域牛人、牛实验室、牛研究成果梳理

    点击公众号"计算机视觉life"关注,置顶星标更快接收消息! 本文阅读时间约5分钟 对于小白来说,初入一个领域时最应该了解的当然是这个领域的研究现状啦.只有知道这个领域大家现在正在 ...

  2. 初识github之项目创建

    登录github后,点击左上角logo章鱼猫,进入主页面,点击start a project ,此时进入新建项目的页面.在repostory name这一栏上写下你想创建的项目的名字.然后在descr ...

  3. Qt setMouseTracking(true) 无效

    网友1:并非只在QWidget中设置setMouseTracking(true)才好用,如若在QMainwindow中设置为true还是不能跟踪,解决办法为在ui中的属性栏主窗口的“mouseTrac ...

  4. arch----------arch下的一些命令,亲测

    1.taoyanghao 不在 sudoers 文件中.此事将被报告. 这个是使用sudo以后报出的错误提示,sudo确定已经安装了. 解决方案:编辑/etc/sudoers文件.找到这一 行:&qu ...

  5. 百度富文本Ueditor编辑器的使用

    往在web开发的时候,尤其是在网站开发后台管理系统的时候经常会使用到富文本编辑器,这里我们来使用百度提供的富文本编辑器UEditor,以提高我们的开发效率 UEditor官网下载地址:https:// ...

  6. db2常见错误代码及原因

    sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 ...

  7. mybatis源码解析11---ParameterHandler解析

    ParameterHandler接口是参数处理器,位于mybatis包的org.apache.ibatis.executor.parameter下,源码如下: public interface Par ...

  8. Docker Swarm redis 集群搭建

    Docker Swarm redis 集群搭建 环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docke ...

  9. Linux统计系统文件类型出现的次数

    awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab /^UUID/ 匹配确定行范围

  10. zabbix/自动发现规则

      对于zabbix 我们并不陌生 他是开源的监控系统,现在的一部分企业都在用zabbix,今天给大家分享的是企业级监控zabbix的自动发现规则,有了它我们自定义健康的时候根据宏值可以让他自动发现对 ...