2017-09-22 23 views
0

私は​​をPython 3で使用して、コマンドライン引数をスクリプトに受け入れます。Python 3でargparseで複数のオプション引数を選択

import argparse 

cli_argparser = argparse.ArgumentParser(description='') 
cli_argparser.add_argument('-n', '--number', type=int, help="Pass a number 'n' to script.", required=False) 
cli_argparser.add_argument('-q', '--query', help="Pass a query to the script", required=False) 
cli_argparser.add_argument('-o', '--outfile', help="Saves the output to an external file.", required=False) 
cli_args = cli_argparser.parse_args() 

if (cli_args.number): 
    print ("\n--number has the value '" + str(cli_args.number) + "'\n") 
elif (cli_args.query): 
    print ("\n--query has the value '" + cli_args.query + "'\n") 
elif (cli_args.outfile): 
    print ("\n--output has the value '" + cli_args.outfile + "'\n") 
else: 
    print ("\nNo Arguments passed. Set or Use a default value...\n") 

特定の引数が1つ選択されている場合は、別のものを指定する必要がありますか?たとえば、-oが指定されている場合は、-nの前または後に-oを含める必要があります。

ようなので、私は、if条件を追加しようとした:

if (cli_args.number): 
    print ("\n--number has the value '" + str(cli_args.number) + "'\n") 
elif (cli_args.query): 
    print ("\n--query has the value '" + cli_args.query + "'\n") 
elif (cli_args.outfile): 
    if (cli_args.number): 
     print ("\n--output has the value '" + cli_args.outfile + "'\n") 
    else: 
     print ("\n--number not specified. Exit..") 
else: 
    print ("\nNo Arguments passed. Set or Use a default value...\n") 

結果は、唯一-oが指定されている場合-nが追加された場合、スクリプトは、しかし、(予想通り)から出ることが第一条件であります真です。

$ python test.py -o output.txt 

--number not specified. Exit.. 

$ python test.py -o output.txt -n 100 

--number has the value '100' 

にはどうすればいいだけ-nが指定されている場合、第一の条件が真であると-oが指定されている場合、それはあまりにも-nを必要とし、その後、第三の条件を実行し、このように変更しますでしょうか? cli_args.number AND cli_args.outfileのようなものでしょうか?それとも、​​に内蔵機能がありますか?

+1

はい、あなたの 'と'は動作しますが、あなたが 'if'チェーンの最初の条件であることを確認する必要があります。代わりにあなたの現在のコードをとり、' outfile'ブロックを先頭に移動してください –

+1

'argparse ''包括的な 'テストはありません。構文解析後のテストは、引数が任意の順序で発生する可能性があることを考慮すると、うまくいきます。デフォルトの 'None'がコマンドラインに現れないので' 'None''は良いテストです。 – hpaulj

答えて

0
elif (cli_args.outfile): 
    if (cli_args.number): 
     print ("\n--output has the value '" + cli_args.outfile + "'\n") 

cli_args.numberが真である時はいつでも、それはあなたの場合は...他の支店に最初の条件を満たしていたとして、ロジックのこのブランチは、コード内で到達不能です。

最初にoutfile and numberを確認するか、最初のif文のロジックをnumber and not outfileに変更することができます。

関連する問題