为什么在命令行中使用 sys.argv 时没有引号?

Why aren't there quotes in sys.argv when they were used at the command line?

这是一个错误吗?

#!/usr/bin/env python3.6
# filename: tmp.py
import sys

print(sys.argv)

已调用:

python tmp.py find . -name '*.py'

实际输出:

['tmp.py', 'find', '.', '-name', '*.py']

预期输出:

['tmp.py', 'find', '.', '-name', "'*.py'"]

请注意实际输出中缺少引号。

不,因为您的 shell 在将参数传递给 python 之前删除了引号(否则它会 扩展 *.py 通配符)

要得到你想要的,你需要:

python tmp.py find -name "'*.py'"

请注意,此行为是 shell 依赖的。在 windows 上,由于单引号没有特殊含义,传递 '*.py',你会得到:

['tmp.py', 'find', '.', '-name', "'*.py'"]

另请注意,引号保护的通配符在 python 方面没有实际意义,因为您需要去除引号才能使用 glob.glob[=15= 评估它们]

shell 负责将其 运行 的命令分解为 C 字符串列表。 然后将那些字符串传递给程序运行。

示例中:

python tmp.py find . -name '*.py'

...正确实现的 shell 将为 the execve syscallargv 元素生成的参数列表看起来(在 C 语法中)如下:

char[][]{ "python", "tmp.py", "find", ".", "-name", "*.py", NULL }

当 Python 运行s 时,它不知道原始命令是什么:它无法知道您输入的是 '*.py' 还是 \*.py 或任何其他事情;它只看到 shell 传递给操作系统的参数列表。