7

ドキュメントが示唆するように:

argparse.REMAINDER. 残りのすべてのコマンドライン引数がリストにまとめられます。これは、他のコマンド ライン ユーティリティにディスパッチするコマンド ライン ユーティリティに一般的に役立ちます。

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print parser.parse_args('--foo B cmd --arg1 XX ZZ'.split())
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

これをまったく同じ目的で使用しようとしましたが、状況によってはバグがあるように見えます(または、概念が間違っている可能性があります)

import argparse

a = argparse.ArgumentParser()

a.add_argument('-qa', nargs='?')
a.add_argument('-qb', nargs='?')
a.add_argument('rest', nargs=argparse.REMAINDER)

a.parse_args('-qa test ./otherutil bar -q atr'.split())

結果:

test.py: error: ambiguous option: -q could match -qa, -qb

明らかに、 にotherutil与えられた引数と何らかの形で「衝突」するような引数がある場合、argparse正しく動作しないようです。

argparseある種の引数に達するとREMAINDER、それ以上の解析を行わずに、リストの最後にあるすべての文字列を使い果たすだけだと思います。どうにかしてこの効果を達成できますか?

4

4 に答える 4

7

基になるユーティリティにオプションをディスパッチしようとしているときに、これに遭遇しました。私が最終的に使用した解決策は、nargs='*'代わりにnargs=argparse.REMAINDERであり、「疑似引数」--を使用して、コマンドと基礎となるツールのオプションを分離します。

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--myflag', action='store_true')
>>> parser.add_argument('toolopts', nargs='*')
>>> parser.parse_args('--myflag -- -a --help'.split())
Namespace(myflag=True, toolopts=['-a', '--help'])

これは、ヘルプ出力で簡単に文書化できます。

于 2018-08-04T15:01:33.000 に答える
4

2 つ使用する必要があります --

a.add_argument('--qa', nargs='?')
a.add_argument('--qb', nargs='?')

-qしたがって、定義したオプションは、少なくとも引数を受け入れ、別の場所で定義された と衝突します。

argparse docから

ArgumentParser.add_argument(name or flags...)

name or flags - Either a name or a list of option strings, e.g. foo or -f, --foo.

@PDaniの最初のコメントに返信するために編集します。

この投稿は興味深いです。

私が理解したことから、argparse は POSIX および GNU スタイルに従います。

重要なことは、短い (1 文字の) オプションをグループ化できることです。1 つのオプションが 1 つの引数を必要とする場合、これをオプション文字に付けることができます。たとえば、このようなものがある場合

a.add_argument('-a', action='store_true')
a.add_argument('-b', action='store_true')
a.add_argument('-c', action='store_true')
a.add_argument('-d', nargs=1)
a.add_argument('-e', nargs=1)

-abcd3 -e5または-a -b -c -d3 -e5またはのように呼び出すことができ-cba -e5 -d3ます

a.add_argument('-abc',  action='store_true')

argparse-abcが 3 つの短い引数が添付されているか、1 つの長い引数が添付されているかを判断するのは非常に困難です。したがって、引数を として定義する必要があります--abc

したがって、長い引数 name を one で使用することはできないと思います-

docoptと呼ばれるコマンドライン解析を実行する別の方法を知っています。一見することはできますが、問題を解決できるとは思えません。

于 2013-03-18T15:08:26.147 に答える
4

おそらく、いくつかの組み合わせArgumentParser.parse_known_args()と、その他の特別な処理のビットでしょうか?

これは完璧ではありませんが、正しい方向につながる可能性があります。

import argparse
import sys

a = argparse.ArgumentParser()
# treat the common-prefixed arguments as options to the prefix
a.add_argument("-q")

# allow a delimiter to set off your arguments from those which should go to the
# other utility, and use parse_known_args() if the delimiter is not present
argv = sys.argv[1:]
if "--" in argv:
    i = argv.index("--")
    args, extra = a.parse_args(argv[:i]), argv[i + 1:]
else:
    a.add_argument("extra", nargs=argparse.REMAINDER)
    args, _ = a.parse_known_args(argv)
    extra = args.extra

# complain if the `-q` option was not specified correctly
if args.q not in ("something", "otherthing"):
    a.error("Must specify '-qsomething' or '-qotherthing'")

print "q:", "-q%s" % (args.q,)
print "extra:", '"%s"' % (" ".join(extra),)

結果:

$ ./testcmd -qsomething test ./otherutil bar -q atr
q: -qsomething
extra: "test ./otherutil bar -q atr"

警告:

  1. これにより、 -prefixed オプション-qの残りの部分との間のスペースが許可されます。-q
  2. これは 1 つのオプションを消費-qしますが、さらに指定した場合に例外が発生するかどうか (または他の役立つことを行うかどうか) は思い出せません。
于 2015-12-14T21:48:36.240 に答える