系统argv包含“c”,但不包含脚本。为什么?

2024-04-19 23:06:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是好奇我觉得奇怪和不一致的行为。你知道吗

我希望sys.argv只包含脚本参数(而不是由python3可执行文件解析的参数)。你知道吗

在实践中,我看到sys.argv包含-c参数,用于python3。让我吃惊的是,下一个参数——脚本主体——不见了。我期望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>

附言。这是一个让我困惑的脚本:

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。你知道吗


Tags: textimport脚本可执行文件parser参数parsesys
1条回答
网友
1楼 · 发布于 2024-04-19 23:06:00

必须有某种东西(因此,希望用户提供的参数从argv[1]开始的程序仍然可以正常工作,-c是一个明智的选择。你知道吗


逻辑是只有一个特殊的argv元素,这是第一个用来标识如何调用脚本的元素。有时它是在这个名称下调用的;在本例中,-c告诉您它是通过传递python -c '...script text...'来调用的。你知道吗

所有其他元素都应该是脚本本身的参数。如果脚本文本作为该脚本本身的一个参数存在,那么对于作为文本传递的脚本,您不能像对待其他情况一样使用相同的命令行解析工具。你知道吗


作为一个比较点,看看bash -c '...script text...' "$0" "$1",这往往会引起相当大的混乱(通常在$0位置传递_,但看到它的人总是问“那个占位符是干什么的?”;增加的价值很小)。Python总是在占位符位置使用-c并在位置1及以后传递更多参数的方法是有意义的。你知道吗

相关问题 更多 >