Как я могу создать каталог с Python, используя разрешения по умолчанию?

Я хочу создать каталог в Python, используя те же разрешения, что и в оболочке mkdir.

В стандартной документации Python говорится:

os.mkdir (путь [, режим])

Создайте каталог с именем пути в числовом режиме. Режим по умолчанию — 0777 (восьмеричный). В некоторых системах режим игнорируется. Там, где он используется, текущее значение umask сначала маскируется. Если каталог уже существует, возникает ошибка OSError.

Мне не нужны разрешения 0777 по умолчанию, а разрешения, унаследованные от родительского каталога. Могу ли я сделать это, не запрашивая разрешения родительского каталога?


person Nathan Fellman    schedule 17.09.2012    source источник


Ответы (2)


Вы уже получили те же разрешения, что и при использовании mkdir оболочки.

В оболочке mkdir:

Для каждого операнда dir утилита mkdir должна выполнять действия, эквивалентные функции mkdir(), определенной в томе System Interfaces стандарта IEEE 1003.1-2001, вызываемой со следующими аргументами:

Операнд dir используется в качестве аргумента пути.

Значение побитового ИЛИ для S_IRWXU, S_IRWXG и S_IRWXO используется в качестве аргумента режима. (Если указана опция -m, параметр-аргумент режима переопределяет это значение по умолчанию.)

Или, более читаемо (из справочной страницы BSD):

... создает каталоги, названные операндами, в указанном порядке, используя режим rwxrwxrwx (0777), измененный текущим umask(2).

Python os.mkdir делает то же самое:

... [t] режим по умолчанию - 0777 ... текущее значение umask сначала маскируется.

Фактически Python вызывает точно такую ​​же функцию POSIX mkdir, которая упоминается в оболочке. документация с точно такими же аргументами. Эта функция определяется как:

Биты разрешения файла нового каталога должны быть инициализированы из режима. Эти биты разрешения файла аргумента режима должны быть изменены маской создания файла процесса.

Или, что более читабельно, со страницы руководства FreeBSD/OS X:

Путь к каталогу создается с правами доступа, указанными в режиме, и ограничивается umask(2) вызывающего процесса.

Если вы работаете на платформе, отличной от POSIX, такой как Windows, Python пытается эмулировать поведение POSIX, даже если в собственной оболочке есть команда mkdir, которая работает иначе. В основном это связано с тем, что основной такой оболочкой является Windows, у которой есть mkdir, синоним md, и подробности того, что он делает в отношении разрешений, даже не задокументированы.

person abarnert    schedule 17.09.2012
comment
короткий ответ: os.mkdir(somepath) дает тот же результат, что и mkdir "$somepath" в оболочке. - person jfs; 18.09.2012
comment
@ J.F.Sebastian: Спасибо, что указали, что я пропустил краткий ответ, прежде чем дать полный. Отредактировано. - person abarnert; 18.09.2012

Похоже, вы можете получить текущие разрешения каталога, в который вы записываете файл, используя Как я могу получить маску разрешений файла? и затем передать этот режим mkdir?

person dm03514    schedule 17.09.2012