Каким будет лучший способ в Python определить, доступен ли каталог для записи пользователю, выполняющему сценарий? Поскольку это, вероятно, будет связано с использованием модуля os, я должен упомянуть, что запускаю его в среде * nix.
python
file
permissions
directory
operating-system
освещенный тигр
источник
источник
os.access()
- это проверка с использованием реальных UID и GID, а не эффективных . Это могло вызвать странности в средах SUID / SGID. ('но сценарий запускает setuid root, почему он не может записать в файл?')os.access(dirpath, os.W_OK | os.X_OK)
возвращает True, даже если у меня нет доступа на запись.Это может показаться странным, но общая идиома Python
Следуя этой идиоме, можно сказать:
Попробуйте написать в соответствующий каталог и перехватите ошибку, если у вас нет на это разрешения.
источник
except: pass
- так вы всегда можете быть оптимистичными и высоко ценить себя. / сарказм прочь. Теперь зачем мне, например, пытаться записать что-то в каждый каталог в моей файловой системе, чтобы создать список доступных для записи мест?Мое решение с использованием
tempfile
модуля:Обновление: после повторного тестирования кода в Windows я вижу, что действительно существует проблема при использовании там временного файла , см. Issue22107: модуль временного файла неверно интерпретирует ошибку отказа в доступе в Windows . В случае каталога, доступного для записи, код зависает на несколько секунд и, наконец, выдает файл
IOError: [Errno 17] No usable temporary file name found
. Может это то, что наблюдал user2171842? К сожалению, на данный момент проблема не решена, поэтому для ее устранения также необходимо отловить ошибку:В этих случаях, конечно, задержка все еще присутствует.
источник
tempfile
. он работает только тогда, когда нетOSError
смысла иметь разрешение на запись / удаление. в противном случае этого не произойдет,return False
потому что ошибка не будет возвращена, и сценарий не будет продолжать выполнение или завершение работы. ничего не возвращается. он просто застрял на этой линии. однако создание невременного файла, такого как ответ khattam, работает как при разрешении, так и при отказе в разрешении. Помогите?Наткнулся на эту ветку в поисках примеров для кого-то. Первый результат в Google, поздравляю!
В этой ветке люди говорят о том, как это делается с помощью Pythonic, но нет простых примеров кода? Вот и все, кто споткнется:
Это пытается открыть дескриптор файла для записи и завершается с ошибкой, если указанный файл не может быть записан: это намного легче читать, и это гораздо лучший способ сделать это, чем выполнять предварительную проверку пути к файлу или каталогу. , поскольку это позволяет избежать условий гонки; случаи, когда файл становится недоступным для записи между временем, когда вы запускаете предварительную проверку, и когда вы фактически пытаетесь записать в файл.
источник
Если вас интересует только файл с завивками,
os.access(path, os.W_OK)
следует делать то, о чем вы просите. Если вместо этого вы хотите узнать, можете ли вы записать в каталогopen()
тестовый файл для записи (он не должен существовать заранее), поймайте и изучите любойIOError
, а затем очистите тестовый файл.В более общем плане, чтобы избежать атак TOCTOU (проблема только в том случае, если ваш скрипт работает с повышенными привилегиями - suid или cgi или около того), вам не следует на самом деле доверять этим заблаговременным тестам, а отказаться от привилегий, выполнить
open()
и ожидать файлIOError
.источник
Проверьте биты режима:
источник
Вот что я создал на основе ответа ChristopheD:
источник
больше информации о доступе можно найти здесь
источник
Я столкнулся с этой же потребностью при добавлении аргумента через argparse. Встроенное
type=FileType('w')
не работало для меня, поскольку я искал каталог. В итоге я написал свой собственный метод решения моей проблемы. Вот результат с фрагментом argparse.Это приводит к следующему:
Я вернулся и добавил print opts.dir до конца, и, похоже, все работает как нужно.
источник
Если вам нужно проверить разрешение другого пользователя (да, я понимаю, что это противоречит вопросу, но может кому-то пригодиться), вы можете сделать это через
pwd
модуль и биты режима каталога.Отказ от ответственности - не работает в Windows, так как не использует модель разрешений POSIX (и
pwd
модуль там недоступен), например - решение только для систем * nix.Обратите внимание, что в каталоге должны быть установлены все 3 бита - чтение, запись и eXecute.
Хорошо, R не является абсолютной необходимостью, но без него вы не можете перечислить записи в каталоге (так что вы должны знать их имена). Execute, с другой стороны, абсолютно необходимо - без него пользователь не может читать inodes файла; поэтому даже имея W, без X файлы не могут быть созданы или изменены. Более подробное объяснение по этой ссылке.
Наконец, режимы доступны в
stat
модуле, их описание находится в inode (7) man .Пример кода, как проверить:
источник