23

私はこの小さな活動を完了するのに苦労しました。実験をしましたが、結果が出ませんでした。

要件:

   test2.py [-c/-v] -f

使用法または規則:

  1. -c(比較)は2つのパラメーターを取ります。

    -v(検証)は1つのパラメーターを取ります。

    これら2つのいずれかが存在する必要がありますが、両方が存在することはできません

  2. -fは必須パラメーター(出力ファイル名)です。

出力:

以下に示すように、目的の出力を得ることができます。

kp@kp:~/Study/scripts$ ./test.py -c P1 P2 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1 
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$ ./test.py -c P1 P2 
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$ 

問題は次のとおりです。

test.py -h、、
1を使用する場合、出力には、-c / -vのいずれかが必須であるが、両方ではないことが示されません。これは、すべての引数がオプションであることを示しています。
2.出力は、オプションの引数の下に-fオプションを示しますが、これは正しくありません。-fは必須の引数であり、外部に表示したい-オプションの引数。

-hオプションの出力がよりユーザーフレンドリーになるようにスクリプトを変更する方法(外部検証なし)

usage: test.py <functional argument> <ouput target argument>

Package Compare/Verifier tool.

optional arguments:
  -h, --help            show this help message and exit
  -f outFileName, --file outFileName
                        File Name where result is stored.
  -c Package1 Package2, --compare Package1 Package2
                        Compare two packages.
  -v Package, --verify Package
                        Verify Content of package.
kiran@kiran-laptop:~/Study/scripts$ 

コード:

私は出力を達成するために以下のコードを使用しています、

#!/usr/bin/python

import sys
import argparse

def main():
    usage='%(prog)s <functional argument> <ouput target argument>'
    description='Package Compare/Verifier tool.'
    parser = argparse.ArgumentParser(usage=usage,description=description)

    parser.add_argument('-f','--file',action='store',nargs=1,dest='outFileName',help='File Name where result is stored.',metavar="outFileName",required=True)


    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-c','--compare',action='store',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
    group.add_argument('-v','--verify',action='store',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
    args = parser.parse_args()

if __name__ == "__main__":
    main()
4

3 に答える 3

28

ファイル名を定位置引数にargparse設定し、独自の使用法メッセージを設定します。

$ python so.py --help
usage: so.py [-h] [-c Package1 Package2 | -v Package] outFileName

ファイル名は定位置である必要がありargparse、独自の使用法メッセージを書き込む必要があります。

コード

#!/usr/bin/python

import sys
import argparse

def main():
    description='Package Compare/Verifier tool.'
    parser = argparse.ArgumentParser(description=description,
                                     epilog='--compare and --verify are mutually exclusive')

    parser.add_argument('f',action='store',nargs=1,
                        help='File Name where result is stored.',
                        metavar="outFileName")

    group = parser.add_mutually_exclusive_group(required=False)
    group.add_argument('-c','--compare',action='store',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
    group.add_argument('-v','--verify',action='store',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')

    args = parser.parse_args()

if __name__ == "__main__":
    main()

ヘルプメッセージ

$ python so.py --help
usage: so.py [-h] [-c Package1 Package2 | -v Package] outFileName

Package Compare/Verifier tool.

positional arguments:
  outFileName           File Name where result is stored.

optional arguments:
  -h, --help            show this help message and exit
  -c Package1 Package2, --compare Package1 Package2
                        Compare two packages.
  -v Package, --verify Package
                        Verify Content of package.

--compare and --verify are mutually exclusive
于 2011-04-09T06:59:23.280 に答える
11

どのような正確な出力を探していますか?--help出力で相互排他性を示すための標準構文を認識していません。これを作成すると、ユーザーが混乱する可能性があります。また、argparseはその構文をサポートしていないと思います(サポートしている場合は、すでに機能しているため)。

シンプルに保ち、各引数のヘルプで相互排除をユーザーに説明することをお勧めします。したがって、ヘルプ文字列を次のように変更します。

-c Package1 Package2, --compare Package1 Package2
                      Compare two packages (may not be used with -v).
-v Package, --verify Package
                      Verify Content of package (may not be used with -c).

それは非常に明白で、かなり簡潔です。

もう1つの方法は、言及せずに、同時に使用しようとすることで相互に排他的であることをユーザーに認識させることです(argparseは、 " PROG: error: argument -c: not allowed with argument -v"などのユーザーフレンドリーなエラーを自動的に生成します)。

于 2011-04-09T07:07:31.013 に答える
4

positional arguments基本的な不満は、デフォルト名とoptional arguementsグループ名にあると思います。でhelp、は次のことをoptional arguments意味しますrequires a flag like -f or --filepositional argumentsを意味しit is identified by positionます。デフォルト値では、positionalsは実際に必須でありoptionals、実際にはオプションです(必須ではありません)。ただし、ユーザーはrequired属性を使用してこれを変更できるため、紛らわしい用語が使用されます。

これを回避する方法は、独自の引数グループを定義することです。これらのグループはのレイアウトに影響しますが、help解析には影響しません。また、usage回線には影響しません。

def main():
    description='Package Compare/Verifier tool.'
    parser = argparse.ArgumentParser(usage=None,description=description)

    maingroup = parser.add_argument_group(title='required')
    maingroup.add_argument('-f','--file',nargs=1,dest='outFileName',help='File Name where result is stored.',metavar="outFileName",required=True)
    exgroup = parser.add_argument_group(title='one or the other')

    group = exgroup.add_mutually_exclusive_group(required=True)
    group.add_argument('-c','--compare',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
    group.add_argument('-v','--verify',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
    args = parser.parse_args()

生成:

usage: stack5603364.py [-h] -f outFileName (-c Package1 Package2 | -v Package)

Package Compare/Verifier tool.

optional arguments:
  -h, --help            show this help message and exit

required:
  -f outFileName, --file outFileName
                        File Name where result is stored.

one or the other:
  -c Package1 Package2, --compare Package1 Package2
                        Compare two packages.
  -v Package, --verify Package
                        Verify Content of package.

は回線mutually_exclusive_groupにのみ影響しusageます。

(-c Package1 Package2 | -v Package)

選択肢の1つが必要なグループを表示します。

[-c Package1 Package2 | -v Package]

オプションのグループになります。 []オプションの(「必須ではない」意味で)引数をマークするために使用されます。-hラベル付けが継続されることに注意してください。

http://bugs.python.org/issue9694は、関連するPythonの問題であり、作成者はこのアプローチargparseを支持しています。argument_group

于 2013-11-22T16:53:45.403 に答える