sys.argv包含“ -c”,但不包含脚本。为什么?

时间:2018-10-10 18:13:14

标签: python command-line-arguments

我只是对sys.argv的行为感到奇怪和不一致。

我希望sys.argv仅包含脚本参数(而不包含python3可执行文件解析的参数)。

在实践中,我看到sys.argv包含用于-c的{​​{1}}自变量。令我惊讶的是,缺少下一个参数-脚本主体。我希望有2个参数或4个参数,但不是3个。

这背后的逻辑是什么?

python3

更新: 好。我知道了。这仅通过$ python3 -c 'import sys;print(sys.argv)' 1 2 ['-c', '1', '2'] 参数而不是其他参数发生:

-c

我仍然发现它令人困惑,并且在嵌入式脚本情况下,$ python3 -b -c 'import sys;print(sys.argv)' -d 1 2 ['-c', '-d', '1', '2'] 将包含脚本文本或argv[0]-c <script text>

P.S。。这是最初让我感到困惑的脚本:

python3 -c <script text>

我很惊讶地看到输出中的第一个-c。事实证明,您不应该只将python3 -c ' import argparse import sys parser = argparse.ArgumentParser() print(parser.parse_known_args(sys.argv)) ' -a 1 -b 2 -c 3 (Namespace(), ['-c', '-a', '1', '-b', '2', '-c', '3']) 传递给argv

1 个答案:

答案 0 :(得分:3)

某事必须存在(因此,期望用户提供的参数以argv[1]开头的程序仍然可以正常运行),-c与任何其他选择一样明智


逻辑是只有一个一个特殊argv元素,这是第一个-argv[0] –用于标识脚本的调用方式。有时,这是它被调用的名称;在这种情况下,-c告诉您它是通过传递python -c '...script text...'来调用的。

所有其他元素应作为脚本本身的参数。如果脚本文本作为该脚本本身的参数 存在,则您不能像其他所有情况一样,使用相同的命令行解析工具来处理作为文本传递的脚本。


作为比较点,请看一下bash -c '...script text...' "$0" "$1",它容易引起一些混乱(通常将_放在$0位置,但是随后看到的人它总是问“占位符是做什么用的?”;它增加的价值很小)。 Python始终在占位符位置使用-c并在位置1及更高位置传递更多参数的方法很有意义。