2009-02-11 7 views
7

W języku Python w systemie Windows istnieje sposób sprawdzenia, czy użytkownik ma uprawnienia dostępu do katalogu? Przyjrzałem się os.access, ale daje to fałszywe wyniki.Python - uprawnienia do katalogu testowego

>>> os.access('C:\haveaccess', os.R_OK) 
False 
>>> os.access(r'C:\haveaccess', os.R_OK) 
True 
>>> os.access('C:\donthaveaccess', os.R_OK) 
False 
>>> os.access(r'C:\donthaveaccess', os.R_OK) 
True 

Czy robię coś nie tak? Czy istnieje lepszy sposób sprawdzenia, czy użytkownik ma uprawnienia dostępu do katalogu?

+1

Pierwszy i trzeci dostęp kończą się niepowodzeniem, ponieważ \ h interpretuje się jako (nieważną) sekwencję unikową –

Odpowiedz

7

Znalezienie uprawnień w systemie Windows może być skomplikowane (uwaga na problemy w systemie Vista z UAC, na przykład! - patrz: related question).

Czy mówisz o prostym dostępie do odczytu, tj. Do czytania zawartości katalogu? Najpewniejszym sposobem testowania uprawnień jest próba uzyskania dostępu do katalogu (np. Wykonanie os.listdir) i wychwycenie wyjątku.

Aby ścieżki zostały poprawnie zinterpretowane, musisz użyć nieprzetworzonych ciągów znaków lub uciec od ukośników odwrotnych ("\\"), lub użyć w zamian ukośników.

(EDIT: można uniknąć ukośniki całkowicie za pomocą os.path.join - zalecany sposób budowania ścieżek)

+0

Dobra odpowiedź, ale w twoim ostatnim punkcie użycie os.path.join lub os.path.sep jest lepsze niż tworzenie ścieżki ręcznie. –

+0

Działa idealnie do moich celów. Dzięki! – Sean

+0

Miło widzieć, że moja własna walka z uprawnieniami nie jest zapomniana :-) – Abgan

5

Podczas os.access próbuje wszelkich starań, aby stwierdzić, czy ścieżka jest dostępna czy nie, to nie rości być perfekcyjnym. Od docs Pythona:

Uwaga: operacje We/Wy może zawieść nawet gdy dostęp() oznacza, że ​​będą one uda, szczególnie dla operacji na systemie plików sieciowych które mogą mieć uprawnienia semantykę poza zwykłym POSIX model zgody-bitowej .

Zalecany sposób sprawdzenia, czy użytkownik ma dostęp do czynności, które należy wykonać, i wychwycenia wszelkich wyjątków.

0

Faktycznie "C: \ haveaccess" różni się od r'C: \ haveaccess '. Z punktu widzenia Python "C: \ haveaccess" nie jest poprawną ścieżką, więc użyj "C: \\ haveaccess". Myślę, że os.access działa dobrze.

+0

'' C: \ haveaccess'' _jest_ prawidłową ścieżką, ponieważ '\ h' nie znaczy nic specjalnego, więc działa (z czystego szczęścia, ale to działa) –