有了:
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 Shell 。引用的字符串保留一個字符串,如sys.argv
所示,並且被正確解釋爲-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 /外殼,不處理引號以同樣的方式?
在Argparse `append` not working as expected
你一個稍微不同的命令行問:
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
正如我已經指出-k filepath
通過爲一個字符串傳遞。由於空間的原因,不會將其解釋爲標誌。但它確實將這個光禿禿的'-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)
是對話題的老長的bug /問題。
看看'sys.argv'。引號是通過解析器還是被shell所吞噬? – hpaulj