とにかく、PythonのGetoptがオプションのオプションのパラメーターを処理するよう説得することはありますか?

StackOverflow https://stackoverflow.com/questions/1532737

  •  20-09-2019
  •  | 
  •  

質問

Pythonのドキュメントによると getopt (私は思う)オプションフィールドは 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
役に立ちましたか?

解決

getopt オプションのパラメーターはサポートしていません。長いオプションの場合、あなたはすることができます:

$ ./testopt.py --verbose=

その結果、空の弦の値が得られます。

あなたは見つけることができます argparse モジュールがより柔軟になります。

他のヒント

残念ながら、方法はありません。から optparseドキュメント:

通常、特定のオプションは、引数を取得するか、そうではありません。多くの人が「オプションのオプション引数」機能を望んでいます。つまり、いくつかのオプションがそれを見れば引数を取り、そうでない場合はしません。これはやや議論の余地があります。なぜなら、それは曖昧な解析をするからです。「-a」がオプションの引数を取り、「-b」が完全に別のオプションである場合、「-AB」をどのように解釈するのですか?このあいまいさのため、OptParseはこの機能をサポートしていません。

編集: oopsは、getoptモジュールではなくoptparseモジュール向けですが、どちらのモジュールも「オプションのオプション引数」を持っていない理由は両方で同じです。

このようなgetoptでオプションのパラメーターを実行できます。

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"

使用法:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

バージョン2.3以降を使用している場合は、 optparse 代わりに、「より便利で、柔軟で、強力な...」であるため、モジュールは新しいものです。悲しいかな、Pyntが答えたように、あなたが望むものを正確に取得することは不可能だと思われます。

PythonのGetoptは、パラメーターを指定するときに '='を使用することを要求することにより、Gnu GetoptのようなオプションのArgを本当にサポートする必要があります。ただし、この制約を暗黙的に変更することにより、この制約を使用すると、非常に簡単にシミュレートできます。

つまり、 - オプションには引数が必要であることを指定し、次のように-option =を調整することができます。

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top