为什么调用 argparse.parse_args() 或 .parse_args(sys.argv) 时有差异

Eph*_*eal 4 python argparse python-3.x

我在 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()
Run Code Online (Sandbox Code Playgroud)

我正在按以下方式执行我的程序。

myProgram.py /path/to/file -project super --test
Run Code Online (Sandbox Code Playgroud)

如果我使用上面的 sysntax ,它就可以正常工作

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

但是,如果我采用 sys.argv 作为输入

args = parser.parse_args(sys.argv)
Run Code Online (Sandbox Code Playgroud)

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

usage: fbu.py [-h] [-project PROJECT] [-release RELEASE] [--test] projectPath
fbu.py: error: unrecognized arguments: /path/to/file
Run Code Online (Sandbox Code Playgroud)

正如我从错误中看到的,还使用了 -h 参数。路径参数必须是最后一个,并且在最后一个示例中错误是有意义的。但为什么它不关心第一个例子中的顺序呢?

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

dec*_*eze 5

sys.argv包含脚本名称作为第一项,即myProgram.py. 这个论点取代了 projectPath. 现在多了一个位置参数/path/to/file,它无法与任何参数匹配,因此会出现错误。

parse_args不带参数的调用ArgumentParser足够聪明,可以忽略解析脚本名称。但是当显式传递参数数组时,它不能这样做,并且会解析所有内容。