为什么调用argparse.parse_args()或.parse_args(sys.argv)会有区别 - python

我在python代码中创建了以下参数解析器。

parser = argparse.ArgumentParser()
parser.add_argument('projectPath')
parser.add_argument('-project')
parser.add_argument('-release')
parser.add_argument('--test', default=False, action='store_true')
args = parser.parse_args()

并且我正在以以下方式执行程序。

myProgram.py /path/to/file -project super --test

如果我将上面的sysntax与

args = parser.parse_args()

但是,如果我接受并使用sys.argv作为输入

args = parser.parse_args(sys.argv)

解析器突然对参数的顺序挑剔,我得到了无法识别的参数错误。

usage: fbu.py [-h] [-project PROJECT] [-release RELEASE] [--test] projectPath
fbu.py: error: unrecognized arguments: /path/to/file

从错误中可以看到,并且也使用-h参数。 path参数必须为last,在最后一个示例中,该错误才有意义。
但是,为什么不关心第一个示例中的顺序?

编辑:我正在使用python版本3.4.3

python大神给出的解决方案

sys.argv包含脚本名称作为第一项,即myProgram.py。该参数采用projectPath的位置。现在有一个附加的位置参数/path/to/file,它不能与任何参数匹配,因此会出现错误。

在不使用参数parse_args的情况下调用ArgumentParser足够聪明,可以省略脚本名称的解析。但是,当显式传递一个参数数组时,它将无法执行该操作并将解析所有内容。