sys.argv 包含“-c”,但不包含脚本。为什么?
sys.argv contains '-c', but not the script. Why?
我只是对 sys.argv
我觉得奇怪且不一致的行为感到好奇。
我希望 sys.argv
只包含脚本参数(而不是 python3
可执行文件解析的参数)。
实际上,我看到 sys.argv
包含用于 python3
的 -c
参数。令我吃惊的是,下一个参数——脚本主体——不见了。我希望有 2 个参数或 4 个参数,但不是 3 个。
这背后的逻辑是什么?
$ 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>
或 python3 -c <script text>
P.S. 下面是最初让我困惑的脚本:
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'])
我很惊讶地看到输出中的第一个 -c。结果你不应该只是将 argv
传递给 parse_known_args
.
Something 必须存在(因此期望用户提供的参数从 argv[1]
开始的程序仍然可以正常工作),而 -c
就像任何明智的选择。
逻辑是只有 一个 特殊 argv 元素,这是第一个 - argv[0]
- 用于识别脚本是如何调用的。有时这是它被调用的名称;在这种情况下,-c
告诉您它是通过传递 python -c '...script text...'
.
来调用的
所有其他元素都应该是脚本本身的参数。如果脚本文本作为该脚本本身的参数 ,您将无法像对其他所有情况一样对作为文本传递的脚本使用相同的命令行解析工具。
作为比较点,请查看 bash -c '...script text...' "[=15=]" ""
,这往往会引起一些混淆(通常将 _
传递到 [=17=]
位置,但是人们看到它的人总是在问 "what's that placeholder for?";它增加的价值很少)。 Python 始终在占位符位置使用 -c
并在位置 1 及以后传递更多参数的方法是有道理的。
我只是对 sys.argv
我觉得奇怪且不一致的行为感到好奇。
我希望 sys.argv
只包含脚本参数(而不是 python3
可执行文件解析的参数)。
实际上,我看到 sys.argv
包含用于 python3
的 -c
参数。令我吃惊的是,下一个参数——脚本主体——不见了。我希望有 2 个参数或 4 个参数,但不是 3 个。
这背后的逻辑是什么?
$ 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>
或 python3 -c <script text>
P.S. 下面是最初让我困惑的脚本:
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'])
我很惊讶地看到输出中的第一个 -c。结果你不应该只是将 argv
传递给 parse_known_args
.
Something 必须存在(因此期望用户提供的参数从 argv[1]
开始的程序仍然可以正常工作),而 -c
就像任何明智的选择。
逻辑是只有 一个 特殊 argv 元素,这是第一个 - argv[0]
- 用于识别脚本是如何调用的。有时这是它被调用的名称;在这种情况下,-c
告诉您它是通过传递 python -c '...script text...'
.
所有其他元素都应该是脚本本身的参数。如果脚本文本作为该脚本本身的参数 ,您将无法像对其他所有情况一样对作为文本传递的脚本使用相同的命令行解析工具。
作为比较点,请查看 bash -c '...script text...' "[=15=]" ""
,这往往会引起一些混淆(通常将 _
传递到 [=17=]
位置,但是人们看到它的人总是在问 "what's that placeholder for?";它增加的价值很少)。 Python 始终在占位符位置使用 -c
并在位置 1 及以后传递更多参数的方法是有道理的。