2015-04-19 52 views
1

我寫了一個函數,最多接受4個選項和2個參數。選項是-1,-2,-3和-u。默認情況下,它們的值分別設置爲true,true,true和false,但啓用任何選項都會導致該值翻轉。問題是,即使當我指定,比如說,Python optparse不接受選項

python comm.py -1 -2 -u test test2 

並且打印選項的值,它們仍然顯示默認值。下面是我的代碼的相關部分:

... 
... 
... 
parser.add_option("-1", action="store_false", dest="xcol1", default=True, help="...") 
parser.add_option("-2", action="store_false", dest="xcol2", default=True, help="...") 
parser.add_option("-3", action="store_false", dest="dups", default=True, help="...") 
parser.add_option("-u", action="store_true", dest="donotsort", default=False, help="...") 

options, args = parser.parse_args(sys.argv[2:]) 

xcol1=options.xcol1 
xcol2=options.xcol2 
dups=options.dups 
donotsort=options.donotsort 


print "xcol1:" 
print xcol1 
print "xcol 2:" 
print xcol2 
print "dups:" 
print dups 
print "donotsort:" 
print donotsort 
print args 
... 
... 
... 

執行與上面的代碼將輸出前述方式命令:

test,test2

即,默認值。它真的應該輸出「False,False,True,True ......」,因爲選項1,2和u已啓用。我在做什麼錯了?是否與解析器有關,因爲我不是100%肯定,我用正確的解析器

此外,當我列出選項-12u代替-1 -2 -u,它的行爲有所不同 - 布爾值是不同的

+0

爲什麼它會按照您的預期工作?你做了'-12u'而不是'-1 -2 -u' – Navith

+0

好的,我把它改成了-1 -2 -u,現在輸出結果是True,False,True,True - 但是,第一個選項應該是False 。另外,我認爲不需要單獨選項之間的空格 – gallardoelise

+2

將'sys.argv [2:]'更改爲'sys.argv [1:]' – Navith

回答

1

應該

options, args = parser.parse_args() 

還加入:

print options 

結果:

xcol1: 
True 
xcol 2: 
True 
dups: 
True 
donotsort: 
False 
['test', 'test2'] 
{'dups': True, 'donotsort': False, 'xcol2': True, 'xcol1': True} 

說明

sys.argv中是一個列表,像[{myScript.py},{ARGS ...}]。 因此,sys.argv [2:]擺脫你的旗幟。

鑑於:

import sys 
print sys.argv 

結果:

>>> python showArgs.py -12u 
>>> ['showArgs.py', '-12u'] 

此外,根據the official docs,optparse是有利於argparse棄用。

+0

'argparse'是3.2+,OP使用的是2.x – Navith

+0

@Navith argparse也可以在2.7中使用:https://docs.python.org/2/howto/argparse。html 或者,在<2.7或<3.2通過點:https://pypi.python.org/pypi/argparsel http://stackoverflow.com/questions/15330175/how-can-i-get-argparse-in -python-2-6 – dantiston