Проверить права доступа к каталогу в Python?

В Python в Windows есть способ определить, есть ли у пользователя разрешение на доступ к каталогу? Я смотрел os.access, но он дает ложные результаты.

>>> 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

Я делаю что-то неправильно? Есть ли лучший способ проверить, есть ли у пользователя разрешение на доступ к каталогу?


person Sean    schedule 11.02.2009    source источник
comment
Первый и третий доступ не работают, потому что \ h интерпретируется как (недопустимая) escape-последовательность   -  person Adam Rosenfield    schedule 12.02.2009


Ответы (3)


Может быть сложно проверить разрешения в Windows (например, остерегайтесь проблем с UAC в Vista! - см. связанный вопрос).

Вы говорите о простом доступе для чтения, то есть о чтении содержимого каталога? Самый надежный способ проверки разрешений - попытаться получить доступ к каталогу (например, выполнить os.listdir) и перехватить исключение.

Кроме того, чтобы пути интерпретировались правильно, вы должны использовать необработанные строки или избегать обратной косой черты ('\\'), - или использовать вместо нее прямую косую черту.

(РЕДАКТИРОВАТЬ: вы можете вообще избежать косой черты, используя os.path.join - рекомендуемый способ построения путей)

person dF.    schedule 11.02.2009
comment
Хороший ответ, но по вашему последнему пункту использование os.path.join или os.path.sep лучше, чем создание путей вручную. - person James Brady; 12.02.2009
comment
Идеально подходит для моих целей. Спасибо! - person Sean; 12.02.2009
comment
Приятно видеть, что моя собственная борьба с разрешениями не забыта :-) - person Abgan; 12.02.2009

Хотя os.access изо всех сил пытается определить, доступен ли путь или нет, он не претендует на звание идеального. Из документов Python:

Примечание. Операции ввода-вывода могут завершиться неудачно, даже если access () указывает, что они будут успешными, особенно для операций в сетевых файловых системах, которые могут иметь семантику разрешений, выходящую за рамки обычной модели битов разрешений POSIX.

Рекомендуемый способ узнать, есть ли у пользователя доступ для каких-либо действий, - это попытаться сделать это и перехватить любые возникающие исключения.

person Theran    schedule 11.02.2009

На самом деле 'C: \ haveaccess' отличается от r'C: \ haveaccess '. С точки зрения Python «C: \ haveaccess» не является допустимым путем, поэтому используйте вместо него «C: \\ haveaccess». Я думаю, что os.access работает нормально.

person Dan F    schedule 15.03.2010
comment
'C:\haveaccess' допустимый путь, потому что \h не означает ничего особенного, поэтому он работает (по чистой случайности, но работает) - person Jean-François Fabre; 09.03.2017