python命令行解析

sys.argv变量

  • sys.argv类型List[str],就是普通的列表,sys.argv[0]运行的脚本
  • 因为每个参数都是str,不能直接解析参数(例如–time=0)
  • 每个参数用空白字符分割,参数包含空白符的用单引号或双引号分开
# 测试脚本
import sys

if __name__ == "__main__":
    print(sys.argv)
    
#命令 python test.py --timeout=0  on=true  -p 80  'wait false' "save out.xml"
#输出 ['test.py', '--timeout=0', 'on=true', '-p', '80', 'wait false', 'save out.xml']

argparse模块

  • 基于optparse(不推荐使用)
  • 帮助信息,附加信息更全面,推荐使用
  • 使用ArgumentParser类解析参数,支持-p 80或-p=80格式,即用=号或空白符分割参数名和参数值
  • 构造ArgumentParser对象后调用add_argument定义命令行参数,–完整参数名,-简写参数名,default默认值
  • 调用parse_args返回Namespace类对象,用属性访问(.)获取参数
# 测试脚本
from argparse import ArgumentParser
from multiprocessing import cpu_count


def parse_option():
    # 构造ArgumentParser
    parser = ArgumentParser(prog='argparse test',
                            usage='info',
                            description='get option from cmdline',
                            prefix_chars='-')
    # print(parser.prog, parser.usage, parser.description)
    # 定义命令行参数
    parser.add_argument('-n',
                        '--num',
                        type=int,
                        dest='number',
                        default=cpu_count())
    parser.add_argument('-f', '--fun', default='ping')
    parser.add_argument('-m', '--mode', default='proc')
    parser.add_argument('-p', '--port')
    parser.add_argument('-w', '--save')
    return parser.parse_args()


if __name__ == "__main__":
    options = parse_option()
    print(options)
    print(options.number, options.fun)

#命令 python test_argparse.py -n 300 -f tcp --mode thread -p 80
#输出 Namespace(fun='tcp', mode='thread', number=300, port='80', save=None)
#    300 tcp thread 80 None

#命令 python test_argparse.py -n 300 -f tcp --mode thread -p=80
#输出 Namespace(fun='tcp', mode='thread', number=300, port='80', save=None)
#    300 tcp thread 80 None

#命令 python test_argparse.py -n 300 -f tcp --mode thread -p 80 -timeout 120
#输出 usage: info
#    argparse test: error: unrecognized arguments: -timeout 120

getopt模块

  • 使用形式接近c语言getopt函数
  • 使用getopt.getopt(args=args, shortopts, longopts=[])初始化
  • args要解析的参数数组,通常为sys.argv[1:]
  • shortopts短参数(-t),有冒号(:)选项必须有值(-t 100或-t100都可,-t=100解析为=100),没有冒号选项不能有值
  • longopts长参数(–timeout),有等号(=)选项必须有值(–t 100或–t100及–t=100都解析100),没有等号选项不能有值
  • 返回一个两元素元组,第一个元素(option, value)格式的列表,第二元素是没匹配的内容列表
  • 遇到未匹配的立即返回,shortopts必须在longopts前,没有匹配的args
  • 返回值没有属性访问(.)或字典访问([])方法,后期处理没有argparse方便
import sys
import getopt


def parse_option(args):
    # 解析命令行
    option, argv = getopt.getopt(
        args=args,
        shortopts='n:t:f',
        longopts=['num', 'timeout', 'fun', 'mode', 'port=', 'save'])
    print(option)
    print(argv)


if __name__ == "__main__":
    parse_option(sys.argv[1:])
    
#命令 python .\test_getopt.py -n 10 -t 120 -f 200 --save 500
#输出 [('-n', '10'), ('-t', '120'), ('-f', '')]
#    ['200', '--save', '500']

#命令 python .\test_getopt.py -n 10 -t 120 -f --save --port 300
#输出 [('-n', '10'), ('-t', '120'), ('-f', ''), ('--save', ''), ('--port', '300')]
#    []

其他模块

  • click
  • fire
  • 个人认为这两个库设计上,不是单纯为了解析命令行参数目的
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值