Python - проверка прав доступа к каталогу - PullRequest
8 голосов
/ 12 февраля 2009

В 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

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

Ответы [ 3 ]

7 голосов
/ 12 февраля 2009

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

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

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

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

5 голосов
/ 12 февраля 2009

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

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

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

0 голосов
/ 15 марта 2010

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

...