Работа с файлом.Conf из нескольких скриптов Python

Я использую модуль ConfigParser для чтения / записи файла.conf из двух скриптов Python. Один скрипт только читает данные, а другой может также записывать в файл.conf. Учитывая этот контекст можно покончить с поврежденными данными? Или ConfigParser предотвращает подобные ситуации?

ура

1 ответ

Сам ConfigParser не знает, как открывать и записывать физические файлы, и поэтому не может предотвратить гонки. Вы передаете файлоподобный объект write() и вам нужно убедиться, что изменяемые вами файлы обновляются атомарно. В системах POSIX, таких как Linux, это обычно делается путем записи во временный файл и переименования его в окончательное имя, когда запись завершена.

Для атомарного переименования требуется, чтобы исходный и целевой файлы находились в одной файловой системе, и простой способ гарантировать это - убедиться, что файлы находятся в одном каталоге.

import ConfigParser
import os
import tempfile

FILENAME = '/some/path/test.config'

config = ConfigParser.SafeConfigParser()
config.read([FILENAME])
config.add_section('foo')
with tempfile.NamedTemporaryFile(dir=os.path.dirname(FILENAME),
                                 delete=False) as tempfile:
  config.write(tempfile)
os.rename(tempfile.name, FILENAME)

Это предполагает, что у вас есть только один одновременный записывающий файл конфигурации в дополнение к одному или нескольким одновременным читателям.

Атомная замена в Windows менее тривиальна. См., Например, возможно ли переименование атомарного файла (с перезаписью) в Windows?, Также имеет отношение к обсуждению Как безопасно записать в файл? - в зависимости от реализации файловой системы (и ее параметров монтирования) изменение метаданных (переименование) может быть завершено до того, как данные будут сохранены в файле.

Другие вопросы по тегам