2011-12-16 65 views
12

我真的很难过这个。python的glob只返回第一个结果

我有一个简单的Python包装,看起来是这样的:

import glob 

for found in glob.glob(filename): 
    if not os.path.isdir(found): 
    my_module.do_stuff(found) 

其中filename已从sys.argv读入。

当我在交互式shell或hello世界脚本中尝试glob时,会得到完整列表(本例中为5)文件。但是,当我在这种情况下使用它时,我只能得到第一个(按字母顺序)。

我通过在数组中捕获glob.glob的结果进行检查,当然,只有len()为1,即使文件名只是'*'

我可能在做什么,打破了glob?!

全部代码文件,以防万一,你能发现我的疑难杂症:

#! /usr/bin/python 
import pynet.quadrons as q 
import os, glob 

def print_usage(): 
    print """ 
    (blah blah big long string.) 

    """ 

if __name__ == "__main__": 
    import sys 
    if len(sys.argv) < 2: 
    print_usage() 
    exit() 

    filename = '' 

    try: 
    filename = sys.argv[1] 
    except: 
    print "error parsing arguments." 
    print_usage() 
    exit() 

    for found in glob.glob(filename): 
    if not os.path.isdir(found): 
     q.load_and_analyse_file(found) 
+2

你能后的样本`sys.argv`? – Blender 2011-12-16 18:35:11

+0

请发布样本:显示文件夹内容和您使用的模式不起作用 – gecco 2011-12-16 18:40:17

回答

14

外壳采用扩展水珠您Python脚本看到它之前。因此,您的Python脚本会看到与sys.argv[1]中的glob匹配的第一个完整文件名,将其传递到​​3210,当然它只能匹配一个文件。

要么在shell中用单引号引用参数,以便shell不会扩展它,要么只是允许shell执行扩展并遍历所有sys.argv(除第一个之外)。

是值得的注意的是在Windows上,做通配符,因此,如果您的脚本需要跨平台工作的外壳,你应该遍历sys.argv[1:]和glob的每个项目。

1

调试101:print len(sys.argv[1:]), repr(sys.argv[1:])

照顾一个或多个文件名和/或一个或多个模式:

for pattern in sys.argv[1:]: 
    for filename in glob.glob(pattern): 
     do_something_with(filename)