Python glob模块要求在argv上加引号

3

test.py代码有什么问题?

$ ls *csv
test1.csv test2.csv test3.csv test4.csv
$ python test.py *csv
test1.csv
$ python test.py '*csv'
test1.csv
test2.csv
test3.csv
test4.csv
$ cat test.py 
#!/usr/bin/python

import sys,glob

for filename in glob.glob(sys.argv[1]):
    print filename
$

我希望不必强制使用引号将参数传递给脚本。

编辑:在接受答案的评论中找到了问题

如果shell扩展起作用,我就不必使用glob,所以循环如下:

for filename in sys.argv[1:]:
    print filename

谢谢!


这几乎是正确的 - 你可能不想包括sys.argv[0],因为它将是你的脚本名称,所以我会使用"for filename in sys.argv[1:]"。 - babbageclunk
哦,你是对的,我会再次编辑。 - Marcel
1个回答

3
这与glob或Python无关,而是通配符在shell中的工作方式。您可以通过将脚本替换为仅执行以下操作来查看此内容:
import sys
print sys.argv

在第一个示例中,*.csv 在脚本运行之前由 shell 展开为多个文件名。您可以通过打印 sys.argv 来查看 - 所有匹配的文件名都将在其中。
如果您不希望 shell 展开通配符,则需要使用引号或使用 \ 进行转义。(这里有一个特殊情况 - 如果没有与之匹配的文件,bash 将传递 *.csv 到您的脚本中。zsh 默认情况下会在这种情况下发出错误信号。)
显然,您可以通过以下方式关闭 shell 中的 glob 展开:
set -f

但我认为这不是你想要的。
有关扩展的大量信息在这里

尝试打印sys.argv - 你会发现它里面有test[1-4].csv的所有内容。sys.argv[1]是test1.csv,所以这就是传递给glob.glob的内容,也是返回的全部内容。 - babbageclunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接