web-dev-qa-db-ja.com

Python argparse:必須オプションを備えた相互に排他的な必須グループ

1つの必須パラメーターを持つ必須の相互に排他的なグループを作成しようとしています。以下は私が置いたコードです

#!/usr/bin/python

import argparse
import sys

# Check for the option provided as part of arguments
def parseArgv():
    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-v", "--verbose", choices=[1,2,3,4],
            help = "Increase verbosity")
    group.add_argument("-q", "--quiet", action="store_true", help = "Run quietly")
    name = parser.add_mutually_exclusive_group(required=True)
    name.add_argument("-n", "--name", help = "Name of the virtual machine")
    name.add_argument("-t", "--template", help = "Name of the template to use \
            for creating vm. If path is not provided then it will be looked \
            under template directory.")
    parser.add_argument("-s", "--save", help = "Save the machine template. If \
            path is not provided then it will be saved under template directory.");
    #parser.add_argument("-k", "--kick_start", required = True, help = "Name of the \
    #        kick start file. If path is not provided then it will be look into http \
    #        directory.")
    if len(sys.argv) == 1:
        parser.print_help()
    args = parser.parse_args()

if __name__ == '__main__':
    parseArgv()

今、このプログラムの出力は次のとおりです

$ python test.py 
usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE]

optional arguments:
  -h, --help            show this help message and exit
  -v {1,2,3,4}, --verbose {1,2,3,4}
                        Increase verbosity
  -q, --quiet           Run quietly
  -n NAME, --name NAME  Name of the virtual machine
  -t TEMPLATE, --template TEMPLATE
                        Name of the template to use for creating vm. If path
                        is not provided then it will be looked under template
                        directory.
  -s SAVE, --save SAVE  Save the machine template. If path is not provided
                        then it will be saved under template directory.
usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE]
test.py: error: one of the arguments -n/--name -t/--template is required

しかし、from行20-22のコメントを外すと、出力は次のように変化します。

$ python test.py 
usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE] -k
               KICK_START

optional arguments:
  -h, --help            show this help message and exit
  -v {1,2,3,4}, --verbose {1,2,3,4}
                        Increase verbosity
  -q, --quiet           Run quietly
  -n NAME, --name NAME  Name of the virtual machine
  -t TEMPLATE, --template TEMPLATE
                        Name of the template to use for creating vm. If path
                        is not provided then it will be looked under template
                        directory.
  -s SAVE, --save SAVE  Save the machine template. If path is not provided
                        then it will be saved under template directory.
  -k KICK_START, --kick_start KICK_START
                        Name of the kick start file. If path is not provided
                        then it will be look into http directory.
usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE] -k
               KICK_START
test.py: error: argument -k/--kick_start is required

ただし、-n/-tと-kのいずれかを必須にする必要があります。同じことを達成する方法。

18
Abhinav

あなたはすでにそれを達成しています! Argparseは、最初に見つかったエラーのみを出力するため、-kのみをチェックしているように見えるかもしれませんが、実際には-n/-tも取得します。これは、実際に-k引数を指定することで確認できます。

-k引数を指定すると、エラーメッセージがtest.py: error: argument -k/--kick_start is requiredからtest.py: error: one of the arguments -n/--name -t/--template is requiredに変わります。

10
Aleksi Torhamo