сам 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 менее тривиально. См. Is an atomic file rename (with overwrite) possible on Windows?. Также имеет значение How to safely write to a file? - в зависимости от реализации файловой системы (и ее параметров монтирования) возможно, что изменение метаданных (переименование) завершится до того, как данные будут сохранены в файле.
Не будет ли исключение/ошибка, вызванная операцией переименования, так как файл FILENAME уже находится в каталоге? – steve
Это верно для Windows, да. Я обновил ответ, чтобы понять это. –
Большое спасибо. Однако мне понадобится независимое от платформы решение, так как мои скрипты могут работать как на Windows, так и на Linux-машинах. – steve