2011-12-16 17 views
12

Naprawdę jestem zaskoczony tym.Glob Pythona powraca tylko pierwszy wynik

mam proste Pythona otoki, który wygląda mniej więcej tak:

import glob 

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

gdzie filename zostały odczytane z sys.argv.

Kiedy próbuję glob w interaktywnej powłoce lub w hello world script, otrzymuję pełną listę (w tym przypadku 5) plików. Jednak kiedy używam go w tym kontekście, otrzymuję tylko pierwszy (alfabetycznie).

Sprawdziłem łapiąc wynik glob.glob w tablicy i na pewno wystarczy, że ma tylko len() z 1, nawet jeśli nazwa pliku jest tylko '*'.

Co mogłem zrobić, że łamie glob?!

plik Pełny kod, tylko w przypadku można dostrzec moją Gotcha:

#! /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

można wysłać próbkę 'sys.argv'? – Blender

+0

Proszę napisać przykład: Pokaż zawartość folderu i użyty wzorzec, który nie działa – gecco

Odpowiedz

14

Powłoka rozszerza glob przed skrypt Python widzi. Dlatego Twój skrypt Pythona widzi pierwszą pełną nazwę pliku, która pasuje do globu w sys.argv[1], przekazuje ją do glob() i oczywiście dopasowuje tylko jeden plik.

Albo zacytuj argument w powłoce pojedynczym cudzysłowem, aby powłoka go nie rozszerzyła, albo po prostu pozwól powłoce wykonać rozszerzanie i iterowanie po wszystkich elementach sys.argv (z wyjątkiem pierwszego).

To warto pamiętać, że w systemie Windows, powłoka nie nie globbing, więc jeśli skrypt musi pracować cross-platform, należy iteracyjne nad sys.argv[1:] i glob każdą pozycję.

+0

Dzięki, dokładnie o co chodzi :) – tehwalrus

1

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

Catering dla jednego lub więcej nazw plików i/lub jeden lub więcej wzorów:

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