概述

在Python的项目开发过程中,我们有时须要为程序提供一些能够通过命令行进行调用的接口。只是,并非直接使用 command + 当前文件 就ok的,我们须要对其设置可选的各种各样的操作类型。所以,这样的情况下我们就有必要对传入的參数进行解析操作。

以下就此问题提出几种不同的解决策略。希望于你故意。


版权说明

著作权归作者全部。

商业转载请联系作者获得授权,非商业转载请注明出处。

作者:Coding-Naga

发表日期: 2016年3月18日

链接:http://blog.csdn.net/lemon_tree12138/article/details/50912898

来源:CSDN

很多其它内容:分类 >> Thinking In Python


文件夹


朴素字符串匹配方案

分析

事实上此方法能够非常直接地表达程序员们在逻辑这条路走了多远。

当然,这并没有包括不论什么的不敬。

这的确是一种方案,甚至能够说是一种算法。由于其直截了当。所以在程序开发初期,本人也是如此乐此不疲。

除了全然的一个一个的命令之外。我们还能够对參数进行json封装,这样就更加体贴了。

关于。这一点我想也不用多说什么的了。

还是留一些时间给后面的两种解决方式比較妥当。只是还是能够说说此方案的长处与缺点。

长处

  1. 针对不同的參数进行不同的处理,针对性强

缺点

  1. 由于其针对性太强,所以其复用性太差

getopt模块

简单介绍

此模块是python内置的一个模块。该模块是专门用来处理命令行參数的。

其基本使用格式例如以下:

  1. opts, args = getopt.getopt(args, shortopts, longopts = [])

对于getopt()方法的第一个參数,就是我们通过命令行传入的參数。

只是这里也有一个值得注意的地方,我须要对參数列表进行切片处理。由于我们获得的第一个(args[0])命令行參数是当前文件名。这并非我们须要的。

对于getopt()的第二个參数,是shortopts。第三个參数,是longopts

shortopts比方:-h

longopts比方:–help

shortopts是以’-‘为前缀的,longopts是以”- -“为前缀的.

我们也能够单独使用短參数。基本使用格式例如以下:

  1. opts, args = getopt.getopt(sys.argv[1:], "ld:")

实战用例

  1. from __init__ import *
  2. def usage():
  3. print 'prama_config.py usage:'
  4. print '-h, --help: Print help message.'
  5. print '-v, --version: Print script version'
  6. print '-o, --output: Input an output verb'
  7. print '-m, --message: Send a message to someone.'
  8. print '--foo: Test option '
  9. print '--fre: Another test option'
  10. def version():
  11. print 'prama_config.py 1.0.1'
  12. def output(args):
  13. print 'Hello, %s' % args
  14. def message(sender, receiver, msg):
  15. print("{0} Send a message to {1}, content is \'{2}\'.".format(sender, receiver, msg))
  16. def main(argv):
  17. try:
  18. opts, args = getopt.getopt(argv[1:], 'hvom:', ['help=', 'message=', 'foo=', 'fre='])
  19. except getopt.GetoptError, err:
  20. print str(err)
  21. usage()
  22. sys.exit(2)
  23. for o, a in opts:
  24. if o in ('-h', '--help'):
  25. usage()
  26. sys.exit(1)
  27. elif o in ('-v', '--version'):
  28. version()
  29. sys.exit(0)
  30. elif o in ('-o', '--output'):
  31. output(a)
  32. sys.exit(0)
  33. elif o in ('-m', '--message'):
  34. message(a, args[0], args[1])
  35. sys.exit(0)
  36. else:
  37. print 'unhandled option'
  38. sys.exit(3)
  39. if __name__ == '__main__':
  40. main(sys.argv)

OptionParser模块

简单介绍

前面说到getopt,只是getopt太小了,并且从代码的角度看。面向过程的嫌疑非常重。

相对getopt,OptionParser就显得比較专业级了。

OptionParser通过parser.add_option()加入选项參数。再通过parser.parse_args()进行解析參数选项。

整个过程非常面向对象

对于OptionParser另一个长处在于,我们不须要为OptionParser设置help的选项。help选项已经被内置到模块其中去了。

parser.add_option()參数说明

  1. action: action是parse_args() 方法的參数之中的一个,它指示 optparse 当解析到一个命令行參数时该怎样处理。actions 有一组固定的值可供选择,默认是’store ‘,表示将命令行參数值保存在 options 对象里。

    action的取值有store, store_true, store_false三个;

  2. dest: dest是存储的变量,命令行的运行命令将会保存到dest指定的值其中。

    比方,以下代码中的-p命令。就会被保存到dest=”pdcl”指定的options的pdcl变量中;

  3. default: 用于设置上面dest中保存变量的默认值。比方以下的代码中,我们就将默认值打成了False。

    那么,我们通过options.pdclp这个变量訪问到的值就是False;

  4. type: 用于指定dest中保存变量值的数据类型。

    默认的数据类型为string;

  5. help: 用于指定当前命令的提示信息。

实战用例

  1. from optparse import OptionParser
  2. parser = OptionParser()
  3. parser.add_option(
  4. "-p", "--pdbk",
  5. action="store_true", # 指示 optparse 当解析到一个命令行參数时该怎样处理
  6. dest="pdcl", # 存储的变量
  7. default=False,
  8. help="write pdbk data to oracle db"
  9. )
  10. parser.add_option(
  11. "-z", "--zdbk",
  12. action="store_true",
  13. dest="zdcl", # 存储的变量
  14. default=False,
  15. help="write zdbk data to oracle db"
  16. )
  17. parser.add_option(
  18. "-f", "--file", # 操作指令
  19. action="store",
  20. dest="filename", # 存储的变量
  21. type="string", # 变量类型
  22. help="write report to FILE", # 显示的帮助信息
  23. metavar="FILE" # 存储变量的值
  24. )
  25. parser.add_option(
  26. "-q", "--quiet",
  27. action="store_false",
  28. dest="verbose",
  29. default=True,
  30. help="don't print status messages to stdout"
  31. )
  32. (options, args) = parser.parse_args()
  33. if options.pdcl is True:
  34. print 'pdcl is true'
  35. if options.zdcl is True:
  36. print 'zdcl is true'
  37. if options.filename is not None:
  38. print("filename={0}".format(options.filename))
  39. print(args)

通过对上面三种參数解析策略的说明,能够看到这里使用OptionParser模块进行解析是最佳方式。


Ref


Python命令行选项參数解析策略的更多相关文章

  1. argparse - 命令行选项与参数解析(转)

    argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...

  2. argparse - 命令行选项与参数解析

    argparse模块作为optparse的一个替代被添加到Python2.7.argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库 ...

  3. python argparse模块:命令行选项及参数解析

    位置参数:给一个例子: import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") ...

  4. python argparse模块解析命令行选项简单使用

    argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...

  5. 9、getopt的用法,被用来解析命令行选项参数

    #include <unistd.h>       extern char *optarg;  //选项的参数指针       extern int optind,   //下一次调用ge ...

  6. getopt:命令行选项、参数处理

    在写shell脚本时经常会用到命令行选项.参数处理方式,如: ./test.sh -f config.conf -v --prefix=/home -f 为短选项,它需要一个参数,即config.co ...

  7. 命令行选项解析函数(C语言):getopt()和getopt_long()

    命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...

  8. pytest 常用命令行选项(二)

    本文接上篇继续简介pytest常用的命令行选项. 8.-v(--verbose) 选项 使用-v/--verbose选项,输出的信息会更详细.最明显的区别就是每个文件中的每个测试用例都占一行,测试的名 ...

  9. 百度URL參数解析

    百度URL參数解析 在用Python爬取百度搜索的内容时,发现百度搜索的url非常的长.往往会跟一大段的參数,但事实上非常多參数都是没有必要的,如相同是搜索javakeyword,能够通过 http: ...

随机推荐

  1. 汕头市队赛 SRM14 T1 计算几何瞎暴力

    计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...

  2. IOS-使用CAShapLayer绘制扇形

    IOS-使用CAShapLayer绘制扇形 为了增加应用体验感,我们动态绘制扇形或者饼状图效果. 这里我们使用CAShapeLayer,这样就不必再-(void)draw函数内绘制图形 参考代码 -( ...

  3. js j将数字每三位用逗号隔开的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Selenium2 鼠标悬停效果实现

    对一些js控件,鼠标悬停的时候出发下拉层的实现 1.使用Action public void moveToElement(WebDriver driver, By locator) { Actions ...

  5. JSP中include指令和include动作浅析

    一. JSP工作原理 JSP文件是一种Servlet,其工作方式是先部署源代码后编译为.class文件.JSP会在客户端第一次请求JSP文件时被编译成Servlet,由Servlet处理客户端的请求. ...

  6. 【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程

    3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在 ...

  7. python3使用urllib获取set-cookies

    #!/usr/bin/env python # encoding: utf-8 import urllib.request from collections import defaultdict re ...

  8. ios 最新系统bug与解决——微信公众号中弹出键盘再收起时,原虚拟键盘位点击事件无效

    最近ios发布新版本系统12.1,随着部分用户的系统更新,一些问题也渐渐暴露出来... 公司用户反映微信公众号出现了点击无效的bug!!测试调查发现,只有iphonex.iphone6,ihpone7 ...

  9. 文件夹操作-DirectoryInfo类

    DirectoryInfo类是一个密封类,它可以用来创建.移动.枚举目录和子目录.DirectoryInfo类包括4个属性,可以用来获取目录的名称.父目录等. DirectoryInfo类的属性表 属 ...

  10. 考勤的lua脚本

    ngx.header.content_type = "text/plain;charset=utf-8" local cjson = require "cjson&quo ...