2012-10-18 164 views
1

我有這些低於線在我的計劃,上述被印刷蟒蛇OptionParser.has_option錯誤

parser = OptionParser() 

parser.add_option("-t","--TIMEOUT", dest="timeout", type="int", help="timeout in seconds") 

if parser.has_option("-t") and options.timeout<=0: 
    print "Timeout if specified must be greater than zero" 
    sys.exit(CLI_ERROR) 

打印語句,因爲parser.has_option(「 - T」)被評估爲true,即使沒有-t選項被指定給這個腳本。我在這裏錯過了什麼。在此先感謝您的幫助。

+0

正常工作:(2.6.5蟒蛇,Ubuntu的)。 – mgilson

+0

我的python版本是2.4.3 – yalkris

+0

你有另一個版本的python,你可以測試你的代碼嗎?這可能是python 2.4中的一個bug,它在以後的版本中得到了修復...... – mgilson

回答

2

您必須首先解析選項。 parser.has_option只是檢查解析器是否理解給定的選項(它的確如此,因爲您使用了add_option來添加它)。

因此,使用

from optparse import OptionParser 

parser = OptionParser() 

parser.add_option("-t","--TIMEOUT", dest="timeout", type="int", help="timeout in seconds") 

options, args = parser.parse_args() 
if options.timeout is not None and options.timeout <= 0: 
    print "Timeout if specified must be greater than zero" 
    sys.exit(CLI_ERROR) 
+0

'parser.has_option'在爲我解析之前工作。當然,代碼會引發一個'NameError',因爲'options'尚未定義。但是這並不能解釋OP所看到的。 OP說這個陳述正在被打印(無條件地),這意味着「選項」被定義在未顯示的代碼中。 – mgilson

+0

此解決方案工作。非常感謝。 – yalkris

+0

@mgilson:在解析之前它如何工作?想想看:如何解析器知道什麼參數解析(提示:它不總是'sys.argv')? 'parser.has_option'檢查* parser是否支持選項*。 – nneonneo

1
(options, args) = parser.parse_args() 
if options.timeout is not None and options.timeout <=0 : 
..... 

你應該看看docopt https://github.com/docopt/docopt。非常適合命令行界面

+0

看來如果沒有定義這個選項,這會引發'AttributeError'。 – mgilson

+0

這將無法正常工作,因爲如果我指定-t 0執行不會進入該塊,因爲options.timeout爲零。我的意圖是打印該消息,如果超時小於或等於零 – yalkris

+0

更新爲檢查不是無。 – locojay