На сервере Linux, над которым я работаю, мне нужно создать каталоги со следующей структурой:
/ dir1 / dir2 / dir3 / YYYY / MM / DD / file.ext
В некоторых случаях (поскольку каталоги зависят от даты) мне нужно создавать более одного каталога за раз, например ... / 2011/01/01 /, причем все они нуждаются в разрешении 0o2755 .
Когда я использую os.makedirs (dir, mode = 0o2755) на моем сервере, он правильно устанавливает часть разрешения 0o755, но игнорирует бит SGID (2). Я предполагаю, что это из-за того, что os.makedirs игнорирует разрешения в некоторых системах, как описано в документации. Я читал, что у других людей были проблемы с umask и os.makedirs (), но я поиграл с umask (установленным на 0002, я пробовал 0000), и он все еще игнорирует бит SGID.
Мое решение для этого заключается в следующей функции:
def special_makedirs(base_dir, target_dir, mode=0o2755):
base_dir = os.path.abspath(base_dir)
target_dir = os.path.abspath(target_dir)
if os.path.commonprefix([base_dir, target_dir]) != base_dir:
log.error("Target directory %s is not a subdirectory of %s" %(target_dir, base_dir))
raise ValueError("Target directory %s is not a subdirectory of %s" % (target_dir, base_dir))
# Create initial directory
os.makedirs(target_dir, mode=mode)
# Verify permissions
temp = target_dir
while temp != base_dir and stat.S_IMODE(os.stat(temp)) != mode:
os.chmod(temp, mode)
temp = os.path.split(temp)[0]
Теперь я уверен, что это не соответствует всем случаям, но я буду единственным, кто использует эту функцию для своих конкретных нужд.
Итак ... мои вопросы:
Я неправильно понимаю документацию os.makedirs, когда говорится, что в некоторых системах игнорируются разрешения? У других была эта проблема?
Кажется ли моя функция наиболее эффективным способом решения этой проблемы?
Спасибо за любые советы, которые вы можете дать. Извините, если моя ситуация не имеет смысла.