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