为什么在命令行中使用 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
syscall 的 argv
元素生成的参数列表看起来(在 C 语法中)如下:
char[][]{ "python", "tmp.py", "find", ".", "-name", "*.py", NULL }
当 Python 运行s 时,它不知道原始命令是什么:它无法知道您输入的是 '*.py'
还是 \*.py
或任何其他事情;它只看到 shell 传递给操作系统的参数列表。
这是一个错误吗?
#!/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
syscall 的 argv
元素生成的参数列表看起来(在 C 语法中)如下:
char[][]{ "python", "tmp.py", "find", ".", "-name", "*.py", NULL }
当 Python 运行s 时,它不知道原始命令是什么:它无法知道您输入的是 '*.py'
还是 \*.py
或任何其他事情;它只看到 shell 传递给操作系统的参数列表。