Python3+getopt解析命令行参数
一、说明
在学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解析命令行参数的更多相关文章
- getopt解析命令行参数一例:汇集多个服务器的日志
高效工作的一个诀窍就是尽可能自动化, 简便化. 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 pssh: pssh -i -h api_hangzhou.iplist " ...
- 【转】getopt分析命令行参数
(一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个 ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- C语言中使用库函数解析命令行参数
在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...
- 【python3基础】命令行参数及 argparse
目录 命令行参数及 argparse 包 argparse 传递 bool 参数错误做法 argparse 传递 bool 参数正确做法 1 argparse 传递 bool 参数正确做法 2 Ref ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
随机推荐
- java之数据库连接池-dbcp&c3p0&dbutils
介绍 因为数据库连接对象的创建比较消耗性能,所以可以在应用程序启动时就在内存中开辟一片空间(集合)存放多个数据库连接对象,后面需要连接时直接从该空间中取而不用新创建:使用完毕后归还连接(将连接重新放回 ...
- 第一章 JQuery概述
1.JQuery的作用:访问和操作DOM元素控制页面样式对页面事件进行处理扩展新的JQuery插件与Ajax技术完美结合注:JQuery能完成的效果js都能完成,但是JQuery的开发效率更高,代码更 ...
- 查询oracle数据字典,并对应出hive的数据类型
SQL开始 select t2.owner||'.'||t2.TABLE_NAME 源表名, 'dl_{0}_seq.'||'tt_{1}_'||lower(t2.table_name) hive表名 ...
- Centos7 Yum安装 PHP5.5,5.6,7.0
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...
- JSONModel(I)
JSONModel使用简介 JSONModel 只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常 ...
- [转载]Oracle Golden Gate - 概念和机制 (ogg)
出处:https://www.cnblogs.com/qiumingcheng/p/5435907.html Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉.变换.投递. OGG ...
- 1005 继续(3n+1)猜想 (25 分)
1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推 ...
- java框架注意
struts2 数据类型不匹配时会return "input" <result name="input">/WEB-INF/index.jsp< ...
- Dart编程语言入门
Dart基础入门语法介绍,详细说明可以查看相关视频<Dart编程语言入门>. 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a = 10; 2 ...
- 2、Kafka架构
Kafka架构图 1)Producer :消息生产者,就是向kafka broker发消息的客户端. 2)Consumer :消息消费者,向kafka broker取消息的客户端 3)Topic :可 ...