草庐IT

Python的OptionParser模块教程

小小程序员ol 2023-03-28 原文

Python中强大的选项处理模块。

示例

#!/usr/bin/pythonfrom optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
	help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
	action="store_false", dest="verbose", default=True,
	help="don't print status messages to stdout")

(options, args) = parser.parse_args()

print options.filename,options.verbose

将上面代码保存到文件option1.py(名字随便),添加执行权限并运行:

./option1.py
./option1.py -f
./option1.py -f foo.txt
./option1.py -f foo.txt -q
./option1.py -qffoo.txt # 注意这个和下面对比
./option1.py -fqfoo.txt
./option1.py --file foo.txt
./option1.py --quiet
./option1.py -h   # -h和--help默认情况optpars自动处理。
./option1.py --help

查看输出结果,稍稍思考就有所的了。

加载模块

要使用 OptionParser 模块,需要在Python程序中导入:

from optparse import OptionParser

生成 OptionParser 实例

首先需要生成一个实例,以后的操作都是操作这个实例,相当于分配了一段内存空 间。不然无处可以操作,类似C中的结构说明。不过Python是面向”对象“的语言。对 象的属性比结构多很多,可操作性更强,后面我们会介绍在生成 OptionParser 对象 的时候可以传递的一些参数。

usage = "usage: %prog [options] arg" # 定义字符串
parser = OptionParser(usage) # 传递一个字符串参数

OptionParser 不要求一定要传递参数,不过传递一些参数,可以方便程序使用。

OptionParser(usage="%prog [-f] [-g]",version="%prog 1.0")
    # %prog 在这里会自动替换为程序名字
    # usage 可以打印用法
    # version 在使用 %prog --version 的时候输出版本信息

使用add_option添加命令行参数

parser.add_option("-f", "--file", dest="filename",
                      help="read data from FILENAME")
    parser.add_option("-v", "--verbose",
                      action="store_true", dest="verbose")
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose")

最后调用parse_args()解析命令行参数

(options, args) = parser.parse_args()

可以传递一个参数列表给parse_args(),否则,默认使用命令行参数 (sys.argv[1:])。parse_args()返回两个值:

  • options , 这是一个对象(optpars.Values),保存有命令行参数值。只要知道 命令行参数名,如file,就可以访问其对应的值:options.file。

  • args , 一个由 positional arguments 组成的列表

parse_args()方法的参数

action

action是parse_args()方法的参数之一,指示optparser解析参数时候该如何处理。 action有一组固定的值可以选择,默认是'store',表是将命令行参数值保存到 options对象里。

parser.add_option("-f","--file",
                  action="store",type="string",dest="filename")
args=["-f","foo.txt"]
(options,args)=parser.parse_args(args)
print options.filename

上面程序会输出"foo.txt"

action的值有:store,store_true,store_false,store_const,append,count,callback.
type

type的默认值是"string",也可以是"int""float"等。

dest

如果没有指定dest参数,将用命令行的参数名来对options对象的值进行存取。

store的形式

store可以为 store_true 和 store_false 两种形式。用于处理命令行参数后面不 带值的情况。如 -v, -q 等命令行参数:

parser.add_option("-v",action="store_true",dest="verbose")
parser.add_option("-q",action="store_false",dest="verbose")

当解析到 -v ,options.verbose值为True,解析到 -q , 值为 False。注意,这里 顺序解析,所以如果有 -vq,最终的值还是False。
default — 设置默认值

# Python学习交流QQ群:489111204 
parser.add_option("-f","--file",
	action="store",
	dest="filename",
	default="foo.txt")
parser.add_option("-v",
	action="store_true",
	dest="verbose",
	default=True)

help — 指定帮助文档

parser.add_option("-f", "--filename",
                  metavar="FILE",
                  help="write output to FILE"),

optparse解析到 -h 或者 —help 命令行参数时,调用 parser.print_help()输出 程序帮助信息。help字段很有用。
metavar — 提示用户期望参数

Group — 给参数分组

group = OptionGroup(parser, ``Dangerous Options",
                    ``Caution: use these options at your own risk."
                    ``It is believed that some of them bite.")
group.add_option(``-g", action="store_true", help="Group option.")
parser.add_option_group(group)

有关Python的OptionParser模块教程的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐