我真的很难过这个。
我有一个简单的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 world脚本中尝试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)
答案 0 :(得分:14)
在Python脚本看到之前,shell正在扩展glob。因此,您的Python脚本会看到与sys.argv[1]
中的glob匹配的第一个完整文件名,并将其传递给glob()
,当然它只匹配一个文件。
使用单引号引用shell中的参数,以便shell不会展开它,或者只是允许shell进行扩展并迭代sys.argv
的所有项(第一项除外)。
值得注意的是,在Windows上,shell 不会执行通配,因此如果您的脚本需要跨平台工作,则应该遍历sys.argv[1:]
和每个项目。
答案 1 :(得分: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)