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

原文地址:https://www.cnblogs.com/lsdb/p/9799679.html

时间: 2024-08-25 18:04:28

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

【转】getopt分析命令行参数

(一) 在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如: ./a.out -a1234 -b432 -c -d 程序会根据读取的参数执行相应的操作,在C语言中,这个功能一般是靠getopt()这个函数,结合switch语句来完成的,首先来看下面的代码: #include <stdio.h>#include <unistd.h> int main(int argc,char *argv[]){  int ch;  opterr=0;    whil

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

一.命令行解析 tprogram_options解析命令行参数示例代码: [cpp] view plaincopy #include <iostream> using namespace std; #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char*argv[]) { //int level; po::options_descripti

flag 是Go 标准库提供的解析命令行参数的包QANDA.REN文库

flag flag 是Go 标准库提供的解析命令行参数的包. 使用方式: flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等:并返回一个相应类型的指针. flag.TypeVar(&flagvar, name, defValue, usage) 将flag绑定到一个变量上. 自定义flag 只要实现flag.Value接口即可: type Value interface { String() string Set(string)

用Google的gflags轻松的编码解析命令行参数

支持的参数类型 gflags支持的类型有bool,int32,int64,uint64,double和string.可以说这些基本类型大体上满足了我们的需求. DEFINE_bool: boolean DEFINE_int32: 32-bit integer DEFINE_int64: 64-bit integer DEFINE_uint64: unsigned 64-bit integer DEFINE_double: double DEFINE_string: C++ string 比如上文

解析命令行参数的方法

一.关于解析命令行参数的方法 关于"解析命令行参数"的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考:https://www.cnblogs.com/aland-1415/p/6613449.html 这里为大家介绍一个比sys.argv更强大的optparse模块. 这里说一句题外话,点开optparse的源码,第一行注释是这样的:A powerful, extensible, and

getopt_long函数解析命令行参数

转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用getopt来实现的. 在Linux下使用getopt写程序是一种比较cool的事情,下面来简单的介绍一下getopt的使用. === getopt使用 === 在讨论参数处理之前,我们先明确两个概念:选项.选项参数gcc -g -o test test.c我们经常使用上面的命令来编译程序,这里g和

3.QT中QCommandLineParser和QCommandLineOption解析命令行参数

 1  新建项目 main.cpp #include <QCoreApplication> #include <QCommandLineParser> #include <QDebug> #include <stdio.h> int main(int argc, char** argv) { QCoreApplication app(argc, argv); app.setApplicationVersion("1.0.0.0");

Python3-argparse模块-解析命令行参数

官方文档 http://python.usyiyi.cn/translate/python_352/library/argparse.html 代码示例 import argparse # 1.获取参数解析对象 parser = argparse.ArgumentParser(description="帮助信息前的一些描述信息,可以不写哦") # 2.添加可解析的参数 # add_argument()函数常用参数 # name or flags 选项字符串的名字或列表,例如foo或者

getopt 分析命令行参数 -n -t 1

在Linux中,我们常常用到 ls -l 等等之类带有选项项的命令,下面,让我们用C++来实现该类似的命令. 在实现之前,首先,我们来介绍一下一个重要函数:getopt() 表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ],const char * optstring); 函数说明: 用来分析命令行参数.参数 argc 和 argv 是由 main() 传递的参数个数和内容. 参数 optstring为选