3

argparse の使用に問題があります。プログラムの動作に影響を与える一連の名前をコマンド ラインで定義できるようにしたいと考えています。次のスニペットを試しました:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("allon", action='store_true', default = False,
                    help="Toggles all output pins to ON.")
parser.add_argument("alloff",action='store_true',
                    help="Toggles all output pins to OFF.")
parser.add_argument("cont", action='store_true',
                    help="Toggles all output pins continously on and off.")
args = parser.parse_args()

if args.allon:
   do_allon()
elif args.alloff:
    do_alloff()
....

しかし、コードの動作は予想外のものです。git statusコードを(先頭の「--」なしで)呼び出したいので、これらのオプションに「--」を使用したくありません。

まず、引数なしでコードを呼び出すと、すべての引数が True に設定されますが、引数が指定されていない場合は False に設定されます。予想される動作は次のとおりです。

python code.py

として呼び出すときに、allon, alloffcont設定したいFalse

python code.py alloff

私はalloncontなるように設定されているFalse間、 と なりたいです。alloffTrue

第二に、私が呼び出すと、例えば、python code.py allon私は得る

code.py: error: unrecognized arguments: allon

私はまったく理解していません。私は optparse の使用方法を知っていますが、上記のスニペットを機能させるために argparse の助けをいただければ幸いです。

ありがとうアレックス

PS if-loop は単に教育的なものであり、実際にはそのように実装されているわけではありません。

4

4 に答える 4

6

git status、などのコマンド パターンが表示される場合は、サブコマンドgit commitについて話していることになります。サブコマンドを作成するために、 argparse ではsub- parsers を使用できます。これは基本的にメイン パーサーと同じです (コマンド ライン スイッチなどを使用します)。

次のように定義します。

import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='sub-command help')

allon_parser = subparsers.add_parser('allon',
    help='Toggles all output pins to ON.')
allon_parser.set_defaults(func=do_allon)

alloff_parser = subparsers.add_parser('alloff',
    help="Toggles all output pins to OFF.")
alloff_parser.set_defaults(func=do_alloff)

cont_parser = subparsers.add_parser('cont',
    help="Toggles all output pins continously on and off.")
cont_parser.set_defaults(func=do_cont)

args = parser.parse_args()
# Call the associated `func` function
args.func()

関数を各サブパーサー ( set_defaults(func=...)) に関連付けたので、args構造体には、func定義された関数の 1 つを指す属性が含まれます。単にそれを呼び出す必要があります。

の出力--help:

usage: PROG [-h] {cont,alloff,allon} ...

positional arguments:
  {cont,alloff,allon}  sub-command help
    allon              Toggles all output pins to ON.
    alloff             Toggles all output pins to OFF.
    cont               Toggles all output pins continously on and off.

optional arguments:
  -h, --help           show this help message and exit
于 2012-09-20T07:33:51.903 に答える
1

関数の最初の引数を必須にし、使用可能な選択肢を制限する場合は、次のようにします。

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("action", action="store", choices=['allon', 'alloff', 'cont'])

args = parser.parse_args()

if args.action == 'allon':
    print 'allon'
elif args.action == 'alloff':
    print 'alloff'

使用例:

$ python req_argparse.py allon
allon
$ python req_argparse.py alloff
alloff
$ python req_argparse.py nope
usage: req_argparse.py [-h] {allon,alloff,cont}
req_argparse.py: error: argument action: invalid choice: 'nope' (choose from 'allon', 'alloff', 'cont')
于 2012-09-20T07:00:52.360 に答える
1

オプションは、通常-、短い引数 (1 文字) の先頭または--長い引数の先頭を使用して指定されます。

したがって、オプションの引数には先頭に 2 つのダッシュを付ける必要があります。

import argparse
parser = argparse.ArgumentParser()
# Note that `default=False` is unnecessary since it's implied by `store_true`.
parser.add_argument("--allon", action='store_true',
                    help="Toggles all output pins to ON.")
parser.add_argument("--alloff",action='store_true',
                    help="Toggles all output pins to OFF.")
parser.add_argument("--cont", action='store_true',
                    help="Toggles all output pins continously on and off.")
args = parser.parse_args()

if args.allon:
    do_allon()
elif args.alloff:
    do_alloff()
....
于 2012-09-20T06:46:17.427 に答える
0

のオプションargparseがオプションのフラグの場合、--次のように開始する必要があります。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--allon", action='store_true', default = False,
                    help="Toggles all output pins to ON.")
parser.add_argument("--alloff",action='store_true',
                    help="Toggles all output pins to OFF.")
parser.add_argument("--cont", action='store_true',
                    help="Toggles all output pins continously on and off.")
args = parser.parse_args()

次にコードを追加すると:

print args.allon, args.alloff, args.cont

プログラムが望ましい動作をすることを実証できます。

$ python test.py
False False False
$ python test.py --allon
True False False
$ python test.py --alloff
False True False
$ python test.py --cont
False False True
$ python test.py --allon --alloff --cont
True True True

statusETA: git の、add、などと同等のサブコマンドがcommit必要な場合、オプションのフラグはそれを実装する正しい方法ではありません。代わりにargparse のadd_subparsers機能を使用する必要があります。

于 2012-09-20T06:45:31.047 に答える