2009-10-07 4 views
6

pythonのgetopt(私が思う)のドキュメントによれば、オプションフィールドはgetopt()の関数として動作するはずです。しかし、私は自分のコードにオプションのパラメータを有効にするために見えることはできません:中オプションにオプションのパラメータを処理するためにpythonのgetoptを説得する方法はありますか?

#!/usr/bin/python 
import sys,getopt 

if __name__ == "__main__": 
    try: 
     opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="]) 
    except getopt.GetoptError, err: 
     print str(err) 
     sys.exit(1) 

    for o,a in opts: 
     if o in ("-v", "--verbose"): 
      if a: 
       verbose=int(a) 
      else: 
       verbose=1 
      print "verbosity is %d" % (verbose) 

結果:

$ ./testopt.py -v 
option -v requires argument 
$ ./testopt.py -v 1 
verbosity is 1 

答えて

8

getoptは、オプションのパラメータをサポートしていません。長いオプションの場合は、次のようにすることができます。

$ ./testopt.py --verbose= 

これは空文字列の値になります。

モジュールをより柔軟に見つけることができます。

5

残念ながら、方法はありません。 optparse docs

通常、指定されたオプションは引数を取るか、指定しないかのいずれかです。たくさんの人が「オプションのオプション引数」機能を望んでいます。これは、オプションを見ると引数を取るオプションと、そうでない場合に引数を取るオプションがあることを意味します。 "-a"がオプションの引数をとり、 "-b"が完全に別のオプションである場合、 "-ab"をどのように解釈するのでしょうか?このあいまいさのため、optparseはこの機能をサポートしていません。

EDIT:おっと、それはoptparseのモジュールではないのgetoptモジュールのためですが、どちらのモジュールは、「オプションのオプションの引数を」持っている理由を推理はどちらも同じです。

+0

optparseはドキュメントだという;) – SilentGhost

+0

うん、私はちょうど、という「間違ったタブの古典的な場合に気づきました"シンドローム。 しかし、私はまだこの推論はgetoptでも相対的だと考えています。 –

+0

また、長いオプションにはオプションの引数を明示的に指定できます。 "--foo"と "--foo = arg"を比較します。 Pythonはこれをサポートしていないようですが、これは非常に貧弱です。途中で何かをゼロから再実装する症状... –

0

バージョン2.3以降を使用している場合は、より便利で柔軟性があり強力なので、代わりにoptparseモジュールを試してみるとよいでしょう。悲しいかな、Pyntが答えたように、あなたが望むものを正確に得ることはできないようです。あなたはこのようにgetoptでオプションのパラメータを行うことができます

+0

を除き、 'optparser' docsはPyntによって投稿されました45分前! – SilentGhost

+0

@ SilentGhost:Pyntの答えを読んでいるうちに、私はget_optよりもoptparseを推奨するものは見当たりません。確かに、私はもともとそれを説明しませんでしたが、そうするように編集しました。 – PTBNL

+0

optparseは、オプションにオプションのパラメータをサポートしていないと具体的に言います。 – stsquad

2

import getopt 
import sys 

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env=']) 
argDict = dict(longopts) 

if argDict.has_key('--env') and argDict['--env'] == 'prod': 
    print "production" 
else: 
    print "sandbox" 

使用方法: '=' を要求することにより、GNUのgetoptのを使用すること よう

$ python scratch.py --env=prod 
production 

$ python scratch.py --env=dev 
sandbox 

$ python scratch.py 
sandbox 
0

Pythonのgetoptのは、本当に、オプションの引数をサポートする必要がありますパラメーターを指定するとき。これを暗黙のうちに--option =

I.Eに暗黙的に変更することで、この制約が適用された を非常に簡単にシミュレートできます。あなたは次のようにその--optionは= --optionする--optionを調整し、その後、引数、 を必要として指定することができます。

for i, opt in enumerate(sys.argv): 
    if opt == '--option': 
     sys.argv[i] = '--option=' 
    elif opt == '--': 
     break 
関連する問題