Подтвердить что ты не робот

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.

Когда я пытаюсь glob в интерактивной оболочке или мире приветствия script, я получаю полный список файлов (в данном случае 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)
4b9b3361

Ответ 1

Оболочка расширяет glob перед тем, как видит Python script. Поэтому ваш Python script видит первое полное имя файла, которое соответствует glob в sys.argv[1], передает это значение в glob(), и, конечно, оно соответствует только одному файлу.

Либо укажите аргумент в оболочке с одинарными кавычками, чтобы оболочка не расширила его, либо просто разрешила оболочке выполнять расширение и повторять все элементы sys.argv (кроме первого).

Стоит отметить, что в Windows оболочка не делает глобусы, поэтому, если ваш script должен работать кросс-платформенным, вы должны перебирать sys.argv[1:] и glob каждый элемент.

Ответ 2

Отладка 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)