Работа с файлом.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?, Также имеет отношение к обсуждению Как безопасно записать в файл? - в зависимости от реализации файловой системы (и ее параметров монтирования) изменение метаданных (переименование) может быть завершено до того, как данные будут сохранены в файле.