声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2242|回复: 0

[Python] [转载]python optparse 模块使用, 及解决中文出错的过程

[复制链接]
发表于 2016-3-11 15:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
使用命令行时,如果要添加选项的话,python 2.3里新增加了一个模块叫optparse,也是专门来处理命令行选项的。

from optparse import OptionParser
parser = OptionParser()
parser.add_option("-p", "--pdbk", action="store_true",
                  dest="pdcl",
                  default=False,
                  help="write pdbk data to oracle db")
parser.add_option("-z", "--zdbk", action="store_true",
                  dest="zdcl",
                  default=False,
                  help="write zdbk data to oracle db")

(options, args) = parser.parse_args()

if options.pdcl==True:
    print 'pdcl is true'
if options.zdcl==True:
    print 'zdcl is true'

add_option用来加入选项,action是有store,store_true,store_false等,dest是存储的变量,default是缺省值,help是帮助提示

最后通过parse_args()函数的解析,获得选项,如options.pdcl的值。
基本使用流程:

》1.產生一個 optparse.OptionParser 的物件。可以在產生時將"程式的命令列說明" (usage) 做為參數,交給 OptionParser 的建構子:


from optparse import OptionParser MSG_USAGE = "myprog[ -f <filename>][ -s <xyz>] arg1[, arg2...]" optParser = OptionParser(MSG_USAGE)

》2.呼叫 OptionParser.add_option() 加入接受的 option:

optParser.add_option("-f", "--file", action = "store", type = "string", dest = "fileName")

參數 action 有許多種類,預設是 "store",所以即使省略也無妨,其它的 action 種類在下面會繼續說明。

若有一個以上的 option,重覆上述的方式加入(注意:以下省略了 action 參數):

optParser.add_option("-s", "--someopt", type = "string", dest = "someopt")

》3.呼叫 OptionParser.parse_args() 進行解讀。如果沒有傳入參數, OptionParser 預設會以 sys.argv[1:] 為對象進行解讀。OptionParser.parse_args() 會傳回一個 tuple,由 optparse.Values 和 一個 list 所組成。下例傳入一個假造的參數列:

fakeArgs = ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge'] options, args = optParser.parse_args(fakeArgs) print options.fileName print options.someopt print args

最後會得到的輸出結果:

thefile.txt xyz ['arg1', 'arg2', 'arge']

這是一個簡單的範例,說明了 OptionParser 的一般使用方式。透過這個例子,可以看到如果為程式加入 option, 並且在程式中取得 option argument 和 positional argument。OptionParser.parse_args() 還有許多用法,下面會說明一部份。

為程式加入 flag option:

許多的 Unix 命令擁有 "-v", "-q" 的 option,代表"提供詳細訊息"或是"不顯示訊息"。要做到這一點,只要在程式中加入下列的 option :

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

第一個 add_option() 加入了一個 "-v" 的 option;如果命令列參數中出現了 "-v",則 opts.verbose 將會是 True;相反的,第二個 add_option() 加入了一個 "-q" option;如果命令列參數中出現了 "-q",則 opts.verbose 將會是 False,這兩者並不相悖,程式可以設計成:當收到 "-v" 時,顯示詳細訊息;當收到 "-q" 時,顯示概略訊息,或完全不顯示;當兩者都沒有收到,則顯示一般的訊息。

設定 option 的預設值:

上述的例子都假設命令例會收到預期中的 option,那麼如果沒有 option 時,接收到的 option 值會是什麼呢?答案是 None!如果想為 option 提供預設值,只要在 OptionParser.parse_args()中指定參數 default 就行了:

parser.add_option("-v", action="store_true", dest="verbose", default = True) parser.add_option("-q", action="store_false", dest="verbose") opts, args = parser.parse_args()

上述的程式碼為程式加入了兩個 option,當 "-v" 沒有出現時, opts.verbose 預設值為 True;當 "-q" 被指定時, opts.verbose 被設定為 False,和上一個例子有點不同。再看下一個例子:

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

opts.verbose 的預設值會是什麼?答案是 True,最後一個指定到同一個目標的 option 預設值會被採用。

一般的 option 亦可加入預設值:
parser.add_option("-f", action="store", dest="fileName", default = "defaultConfig.txt")

為程式加入說明:

標準的 Unix 命令大多有著 "-h", "--help" 的 option,會將使用說明印出來。在 OptionParser.parse_args() 中指定 "help" 參數,並指定說明的字串,就可以為這個 option 加入說明了:

parser.add_option("-v", action="store_true", dest="verbose", default=False, help="make lots of noise [default]")

當程式收到 "-h" 或 "--help",交給 OptionParser 解讀時,會自動印出說明內容,而忽略其它的 argument:

usage: <yourscript> [options] arg1 arg2 options: -h, --help show this help message and exit -v, --verbose make lots of noise [default] -q, --quiet be vewwy quiet (I'm hunting wabbits) -fFILE, --file=FILE write output to FILE -mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate' [default], 'expert'

還記得一開始提到交給 OptionParser 建構子的參數 MSG_USAGE 嗎? optparse 套件對 usage 訊息也提供了一些支援。在 usage 中使用 "%prog" 關鍵字, OptionParser 會自動將其代換為程式名,即 sys.args[0]:

usage = "usage: %prog [options] arg1 arg2"

如果程式名為 "myprog",則出現在 help 訊息中的 usage 就會是:

usage = "usage: myprog [options] arg1 arg2"

如果OptionParser 建構子沒有收到任何參數,則會自動產生一個 usage 訊息:

"usage: %prog [options]"

前提是程式沒有 positional argument。甭擔心 option 在 help 訊息中排列的方式, OptionParser 會搞定一切,如同前面程式所示。

python 使用OptionParser的时候使用中文出错的解决过程
今天在使用OptionParser的时候,在填写帮助信息的时候使用了中文,却发现报了一系列的错误代码如下#!/usr/bin/env python#coding:UTF-8import ConfigParser,systry:from optparse import OptionParserexcept ImportError:try:from optik import OptionParserexcept ImportError:raise ImportError, ‘Requires Python 2.3 or the Optik option parsing library.’parser = OptionParser()parser.add_option(”-f”,”–file”,dest=”name”,help=”帮助信息”,metavar=”FILE”)parser.add_option(”-q”,”–quit”,action =”store_false”,dest=”verbose”,default=”True”,help=”帮助信息”)(options,args) = parser.parse_args()错误信息File “get-parser-cn.py”, line 23, in <module>(options,args) = parser.parse_args()File “/usr/lib/python2.5/optparse.py”, line 1387, in parse_argsstop = self._process_args(largs, rargs, values)File “/usr/lib/python2.5/optparse.py”, line 1431, in _process_argsself._process_short_opts(rargs, values)File “/usr/lib/python2.5/optparse.py”, line 1538, in _process_short_optsoption.process(opt, value, values, self)File “/usr/lib/python2.5/optparse.py”, line 774, in processself.action, self.dest, opt, value, values, parser)File “/usr/lib/python2.5/optparse.py”, line 796, in take_actionparser.print_help()File “/usr/lib/python2.5/optparse.py”, line 1657, in print_helpfile.write(self.format_help().encode(encoding, “replace”))UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 124: ordinal not in range(128)和 @smallfish9 同学 讨论了一番,并搜索了一些资料后,找到了解决方案如下import sysreload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 ,可以注释掉来试试,会提示没有这个setdefaultencoding方法的#!/usr/bin/env python#coding:UTF-8import ConfigParser,sysreload(sys)print sys.getdefaultencoding()sys.setdefaultencoding(’utf-8′)try:from optparse import OptionParserexcept ImportError:try:from optik import OptionParserexcept ImportError:raise ImportError, ‘Requires Python 2.3 or the Optik option parsing library.’ parser = OptionParser() parser.add_option(”-f”,”–file”,dest=”name”, help=”帮助信息”,metavar=”FILE”) parser.add_option(”-q”,”–quit”, action =”store_false”,dest=”verbose”,default=”True”, help=”帮助信息”) (options,args) = parser.parse_args() 再进行 python  get-parser-cn.py -h 的时候,可爱的中文就出来了
今天在使用OptionParser的时候,在填写帮助信息的时候使用了中文,却发现报了一系列的错误

代码如下

#!/usr/bin/env python

#coding:UTF-8

import sys

from optparse import OptionParser

parser = OptionParser()

parser.add_option(”-f”,”–file”,dest=”name”,help=”帮助信息”,metavar=”FILE”)

(options,args) = parser.parse_args()

错误信息

File “get-parser-cn.py”, line 23, in <module>

(options,args) = parser.parse_args()

File “/usr/lib/python2.5/optparse.py”, line 1387, in parse_args

stop = self._process_args(largs, rargs, values)

File “/usr/lib/python2.5/optparse.py”, line 1431, in _process_args

self._process_short_opts(rargs, values)

File “/usr/lib/python2.5/optparse.py”, line 1538, in _process_short_opts

option.process(opt, value, values, self)

File “/usr/lib/python2.5/optparse.py”, line 774, in process

self.action, self.dest, opt, value, values, parser)

File “/usr/lib/python2.5/optparse.py”, line 796, in take_action

parser.print_help()

File “/usr/lib/python2.5/optparse.py”, line 1657, in print_help

file.write(self.format_help().encode(encoding, “replace”))

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 124: ordinal not in range(128)

和 @smallfish9 同学 讨论了一番,并搜索了一些资料后,找到了解决方案如下

import sys

reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 ,可以注释掉来试试,会提示没有这个setdefaultencoding方法的

完整的代码

#!/usr/bin/env python

#coding:UTF-8

import sys

from optparse import OptionParser

reload(sys)

print sys.getdefaultencoding()

sys.setdefaultencoding(’utf-8′)

parser = OptionParser()

parser.add_option(”-f”,”–file”,dest=”name”,

help=”帮助信息”,metavar=”FILE”)

(options,args) = parser.parse_args()

再进行 python  get-parser-cn.py -h 的时候,可爱的中文就出来了
转自:http://blog.sciencenet.cn/home.php?mod=space&uid=600900&do=blog&id=471221
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-28 12:34 , Processed in 0.084955 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表