:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-M', '--module',
help="Module to run on changed files - should be in format MODULE:CLASS\n\
Specified class must have function with the signature run(src, dest)\
and return 0 upon success",
)
parser.add_argument('-A', '--module_args',
help="Arg to be passed through to the specified module",
action='append',
default=[])
import sys
print(sys.argv)
print(parser.parse_args())
私が手:
1028:~/mypy$ python stack45146728.py -M module:class -A "-f filename"
['stack45146728.py', '-M', 'module:class', '-A', '-f filename']
Namespace(module='module:class', module_args=['-f filename'])
これは、Linuxのシェルを使用しています。引用された文字列は、sys.argv
にあるように1つの文字列のままで、-A
の引数として正しく解釈されます。
引用符なしの場合、-f
は別個であり、フラグとして解釈されます。
1028:~/mypy$ python stack45146728.py -M module:class -A -f filename
['stack45146728.py', '-M', 'module:class', '-A', '-f', 'filename']
usage: stack45146728.py [-h] [-M MODULE] [-A MODULE_ARGS]
stack45146728.py: error: argument -A/--module_args: expected one argument
あなたはwindows
や引用符を同じように処理しない他のいくつかのOS /シェルを使用していますか?私はすでに-k filepath
が1つの文字列として渡される述べたように
1032:~/mypy$ python stack45146728.py -A "-k filepath" -A "-t"
['stack45146728.py', '-A', '-k filepath', '-A', '-t']
usage: stack45146728.py [-h] [-M MODULE] [-A MODULE_ARGS]
stack45146728.py: error: argument -A/--module_args: expected one argument
:Argparse `append` not working as expected
で
あなたがわずかに異なるコマンドラインをについて尋ねました。スペースのために、はそれをフラグとして解釈しません。しかし、それは裸の '-t'をフラグとして解釈します。
フラグの代わりに未定義の '-xxx'文字列を引数として解釈する可能性についてバグ/問題がありました。私はそれを見て、何かが生産に入ったかどうかを見なければならないだろう。
文字列がフラグまたは引数として分類される方法の詳細はargparse.ArgumentParser._parse_optional
メソッドにあります。
# if it contains a space, it was meant to be a positional
if ' ' in arg_string:
return None
http://bugs.python.org/issue9334argparse does not accept options taking arguments beginning with dash (regression from optparse)
が話題に古いものと長いバグ/問題である:それはコメントが含まれています。
'sys.argv'を見てください。引用符でパーサーに伝わるのか、それともシェルで飲み込まれていますか? – hpaulj