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

时间:2017-11-15 22:11:48

标签: python shell command-line-arguments

这是一个错误吗?

#!/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'"]

请注意实际输出中缺少报价。

2 个答案:

答案 0 :(得分:4)

不,因为你的shell在将参数传递给python之前删除了引号(否则它会展开 python tmp.py find -name "'*.py'" 通配符)

获得你想要的东西:

'*.py'

请注意,此行为取决于shell。在Windows上,因为单引号没有特别的意义,传递['tmp.py', 'find', '.', '-name', "'*.py'"] ,你会得到:

glob.glob

另请注意,受到引用保护的通配符在python方面没有任何实际意义,因为您需要删除引号才能使用refresh_token评估它们

答案 1 :(得分:2)

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

在示例中:

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

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

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

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