2013-02-15 15 views
5

Dlaczego nie pracuje dla mnie os.remove(-string-)? Mam kod napisany w sposób następujący:Python: os.remove nie działa

try: 
os.remove(a) 
    output = current_time() + "\trmv successful" 
    message = message + '\n' + output 
    message = "".join(message) 
    return message 

except OSError: 
    try: 
     os.removedirs(a) 
     output = current_time() + "\trmv successful" 
     message = message + '\n' + output 
     message = "".join(message) 
     return message 

    except OSError: 
     output = current_time() + "\trmv failed: [?]" 
     message = message + '\n' + output 
     message = "".join(message) 
     return message 

I byłoby powrócić 21:32:53 rmv failed: [?] za każdym razem wykonywać polecenia z rmv w kliencie. Moja wersja Pythona to 2.6.1, jeśli to pomaga.

+1

Jaki rodzaj pliku próbujesz usunąć? 'os.remove' nie działa z katalogami ... a' removeirs' działa tylko wtedy, gdy katalogi nie są puste. – mgilson

+0

Co stanie się, jeśli nie pojawi się błąd lub wyjątek, a polecenie remove i tak nie działa? – darkgaze

Odpowiedz

7

Wyjątki są do obejrzenia! Sprawdź to:

try: 
    os.remove(a) 
except OSError as e: # name the Exception `e` 
    print "Failed with:", e.strerror # look what it says 
    print "Error code:", e.code 

Zmodyfikuj kod, aby wyświetlić komunikat o błędzie, a dowiesz się, dlaczego się nie udało. The docs może ci pomóc.

+0

Nieważne, użyłem 'print" Nie powiodło się z: ", e' i działa dobrze. Okazuje się, że nie mam wystarczających uprawnień. Dzięki! – Eugene

3

Dlaczego nie spróbować wydrukować błędu?

try: 
    os.remove(a) 
    output = current_time() + "\trmv successful" 
    message = message + '\n' + output 
    message = "".join(message) 
    return message 

except OSError, e: 
    print ("Failed to remove %s\nError is: %s" % (a,e)) 
    try: 
     os.removedirs(a) 
     output = current_time() + "\trmv successful" 
     message = message + '\n' + output 
     message = "".join(message) 
     return message 

    except OSError, e: 
     print ("Failed twice to remove %s\nError is: %s" % (a,e)) 
     output = current_time() + "\trmv failed: [?]" 
     message = message + '\n' + output 
     message = "".join(message) 
     return message 

Błąd może być dosłownie wszystko, co widzisz ... Na przykład problem uprawnień?

+2

Dokładnie, co się stało ... Problem z uprawnieniami. – Eugene

0

spróbuj umieścić jakiś time.sleep opóźnienia (0.2) po otwarciu/usuwania plików lub Wydaje Windows i/lub program antywirusowy WYDANIE

Josh Rosenberg na śledzenie this błąd na rozwój Pythona wskazuje na to samo:

Krótka wersja: Narzędzia indeksujące i antywirusowe zapobiegają usunięciu.

Dłuższa wersja: DeleteFile (i wszystkie rzeczy, które ostatecznie przekazuje do DeleteFile) działają w zabawny sposób w systemie Windows. Wewnętrznie otwiera UCHWYT do pliku, zaznacza go jako oczekujące usunięcie i zamyka UCHWYT. Jeśli nikt nie wkradł się i nie chwycił innego pliku w tym czasie, plik jest usuwany, gdy ukryty jest ukryty HANDLE DeleteFile. Dobrze zaprojektowane narzędzia antywirusowe/indeksujące używają oplocków (http://blogs.msdn.com/b/oldnewthing/archive/2013/04/15/10410965.aspx), aby mogły otwierać plik, ale bezproblemowo zejdą z drogi, jeśli normalny proces wymaga wyłącznej kontroli nad plikiem lub usunięcia go. Niestety "dobrze zaprojektowany" nie jest terminem zazwyczaj związanym z narzędziami antywirusowymi, więc takie błędy są stosunkowo powszechne.

Obejścia takie jak używanie GetTempFileName() i MoveFile() do przeniesienia pliku z drogi będą działały, chociaż uważam, że wprowadzają własne warunki wyścigu (sam plik temp jest tworzony, ale UCHWYT jest natychmiast zamknięty, co może oznacza wyścig do otwarcia pustego pliku przez zły antywirus, który blokuje MoveFile()).

Zasadniczo, jeśli używasz systemu Windows i używasz nieprzyjaznych narzędzi antywirusowych/indeksujących, nie ma czystego rozwiązania, które zachowałoby to samo zachowanie. Nie można ciągle tworzyć i usuwać plików o tej samej nazwie bez ryzyka odmowy dostępu.

To powiedziawszy, prawdopodobnie można uzyskać takie same wyniki, otwierając i zamykając plik tylko raz. Zmień z oryginalnego pseudokod: