我只是好奇我觉得奇怪和不一致的行为。你知道吗
我希望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
。你知道吗
必须有某种东西(因此,希望用户提供的参数从
argv[1]
开始的程序仍然可以正常工作,-c
是一个明智的选择。你知道吗逻辑是只有一个特殊的argv元素,这是第一个用来标识如何调用脚本的元素。有时它是在这个名称下调用的;在本例中,
-c
告诉您它是通过传递python -c '...script text...'
来调用的。你知道吗所有其他元素都应该是脚本本身的参数。如果脚本文本作为该脚本本身的一个参数存在,那么对于作为文本传递的脚本,您不能像对待其他情况一样使用相同的命令行解析工具。你知道吗
作为一个比较点,看看
bash -c '...script text...' "$0" "$1"
,这往往会引起相当大的混乱(通常在$0
位置传递_
,但看到它的人总是问“那个占位符是干什么的?”;增加的价值很小)。Python总是在占位符位置使用-c
并在位置1及以后传递更多参数的方法是有意义的。你知道吗相关问题 更多 >
编程相关推荐