2017-03-07 8 views
0

getoptを使用してコマンドライン引数を解析しようとしています。 1つの引数を正常に解析します。複数の引数を渡そうとすると、最初のフラグが使用され、その他の引数はすべてargsに残ります。また、引数リストの後にコロンを付けて引数を渡さないと、例外が発生しません。python getoptが期待通りにフラグを処理していません

私が持っている:

def main(argv): 
    try: 
     opts, args = getopt.getopt(argv,"ns:i:",["num_ratios", "sample=", "iteration="]) 
    except getopt.GetoptError: 
     print ('test.py -s <sampleName -i <iteration>') 
     sys.exit(2) 
    print (opts) 
    print (args) 
    for opt, arg in opts: 
     if opt == '-n': 
      n = arg 
     elif opt == '-s': 
      sampleName=arg 
     elif opt == '-i': 
      iteration = arg 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

を私はその後、実行した場合:

python calculateRatios.py -n 1 -s wibble 

私はそれがオプションとして-n拾ったがいないことを私に言って

[('-n', '')] 
['1', '-s', 'wibble'] 

を取得値1を関連付けると停止します。値を割り当てないので、それ以上のフラグを見つけることはできません。

python calculateRatios.py -n 1 

私の理解は、私ははgetopt.getopt呼び出し中のSの後にコロンを持っているように例外がキックオフということです。私はその後、実行

。それは、代わりに私はこれらの例の両方で

[('-n', '')] 
['1'] 

を取得し、それから来るのどこ私は知らないことをオプトインで空の文字列は、ありますしません。それは問題ですか?それはどこから来たの?私はそれが私が逃した小さなものだと思っています。 I

答えて

0

これは予想通りです。コロンを置かなければならないか、パラメータはnオプションに関連付けられません。nオプションは単なるスイッチです。その後、Arg解析は非同期化され、getoptは別のオプションに遭遇しないので、他のオプションでない引数が渡されることを前提としています。

そのように修正してください。あなたは例外を取得している唯一の方法は、コマンドラインの末尾に引数なし引数に必要な引数を渡すことで、そうでない場合は、他のスイッチ/引数が消費されていることを

"n:s:i:",["num_ratios=", "sample=", "iteration="] 

注意。ほとんどの時間を適用 - - 私は、引数と非同期化引数の解析を省略することからユーザーを防ぐためにやった

は次のように(ほとんどの引数は-によって開始されません)-で始まらないargことをテストすることです:

オプションの引数は -で始めることができますが、ほとんどのケースではそれができない場合はそううまくいかない
for opt, arg in opts: 
    if arg.startswith("-"): 
     raise Exception("Argument omitted for {}".format(opt)) 
    if opt == '-n': 
     n = arg 
    elif opt == '-s': 
     sampleName=arg 
    elif opt == '-i': 
     iteration = arg 

+0

しかし、私はnが必要なオプションであるとは考えていませんでした。私が従ってきた例(例えば、http://www.diveintopython.net/scripts_and_streams/command_line_arguments.html)は、必須ではないオプションの後にコロンを必要としないことを示唆しています。また、-sオプションが指定されていないときに発火しない例外は修正されません。何が起こっているのでしょうか? – Ben

+0

'getopt'で必要なオプションがあったのはどこですか? ':'オプションは引数を必要とします。このオプションは、引数が_and_がコマンドラインの最後のものを逃した場合にのみ失敗します。必須/オプションの場合は、optparserに切り替えることをお勧めします。 –

+0

引数が必要なオプションは、必須の引数です。または私は間違ってそれを読んでいますか? – Ben

関連する問題