この問題は、http://bugs.python.org/issue9334で詳細に説明されています。ほとんどの活動は2011年に行われました。去年パッチを追加しましたが、パッチのバックログがかなりあります。
'--env'
、または"-s WHATEVER -e COOL STUFF"
のような文字列の潜在的なあいまいさは、引数をとるオプションの後にあると問題になります。
optparse
単純な左から右への解析を行います。最初の--env
は、1つの引数を取るオプションフラグです。したがって、それは見た目に関係なく、次のものを消費します。一方、は、文字列を2回ループします。まず、それらを 'O'または 'A'(オプションフラグまたは引数)として分類します。 2番目のループでは、変数nargs
の値を処理するためにre
のようなパターンマッチングを使用して、それらを消費します。この場合、OO
、2つのフラグ、および引数がないようです。
を使用する場合の解決方法は、引数文字列がオプションフラグと混同されないようにすることです。ここに(とバグの問題で)示されている可能性が含まれます:自体'--env'
ことで
--env="--env" # clearly defines the argument.
--env " --env" # other non - character
--env "--env " # space after
--env "--env one two" # but not '--env "-env one two"'
フラグ(引用された場合でも、sys.argv
を参照)のように見えますが、他の文字列が続いたときにそれはしていません。しかし、"-env one two"
には、['-e','nv one two']
、 `-e 'フラグの後に文字列(あるいはそれ以上のオプション)が続くと解析できるので問題があります。
--
およびnargs=argparse.PARSER
も、次のすべての文字列を引数として表示させるために使用することができます()。しかし、彼らは引数リストの最後でのみ動作します。
問題9334には、args_default_to_positional=True
モードを追加するためのパッチが提案されています。このモードでは、パーザは文字列を定義済みの引数と明確に一致させることができる場合にのみ、文字列をオプションフラグとして分類します。したがって、 '--env --one'の'one 'は引数として分類されます。しかし、 '--env --env'の2番目の ' - env'は引き続きオプションフラグとして分類されます。
Using argparse with argument values that begin with a dash ("-")
parser = argparse.ArgumentParser(prog="PROG")
parser.add_argument("-f", "--force", default=False, action="store_true")
parser.add_argument("-e", "--extra")
args = parser.parse_args()
print(args)
に関連する場合に拡張
は-foo
が-f
フラグとして解釈されるので "-fooつ" の場合に障害が発生した
1513:~/mypy$ python3 stack16174992.py --extra "--foo one"
Namespace(extra='--foo one', force=False)
1513:~/mypy$ python3 stack16174992.py --extra "-foo one"
usage: PROG [-h] [-f] [-e EXTRA]
PROG: error: argument -e/--extra: expected one argument
1513:~/mypy$ python3 stack16174992.py --extra "-bar one"
Namespace(extra='-bar one', force=False)
1514:~/mypy$ python3 stack16174992.py -fe one
Namespace(extra='one', force=True)
を生成しますプラス不特定のエクストラ。これは、-fe
を['-f','-e']
と解釈するのと同じ動作です。
-e
は、そのフラグの引数として解釈された後、私はnargs
REMAINDER
に(ないPARSER
)、すべてを変更する場合:
parser.add_argument("-e", "--extra", nargs=argparse.REMAINDER)
すべての例の仕事。値はリストであることに注意してください。そして、引用符は必要ありません:それは旗のように見えるかどうかかどうか、以下のすべてを取る以外
1518:~/mypy$ python3 stack16174992.py --extra "--foo one"
Namespace(extra=['--foo one'], force=False)
1519:~/mypy$ python3 stack16174992.py --extra "-foo one"
Namespace(extra=['-foo one'], force=False)
1519:~/mypy$ python3 stack16174992.py --extra "-bar one"
Namespace(extra=['-bar one'], force=False)
1519:~/mypy$ python3 stack16174992.py -fe one
Namespace(extra=['one'], force=True)
1520:~/mypy$ python3 stack16174992.py --extra --foo one
Namespace(extra=['--foo', 'one'], force=False)
1521:~/mypy$ python3 stack16174992.py --extra -foo one
Namespace(extra=['-foo', 'one'], force=False)
argparse.REMAINDER
は、「*」のようなものです。 argparse.PARSER
は、最初にpositional
のような引数が必要であるという点で、 '+'とよく似ています。 subparsers
が使用するのはnargs
です。あなたは
https://docs.python.org/3/library/argparse.html#nargsを使用しているのPythonのバージョンは何
これは文書化されて
REMAINDER
の使用、? – William私はPython 2.7を使用しています。 – sfendell
これはPython 2.7でうまく動作します。他の*引数が設定されていますか? –