2013-12-04 2 views
0

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

Приветствия

ответ

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

+0

Не будет ли исключение/ошибка, вызванная операцией переименования, так как файл FILENAME уже находится в каталоге? – steve

+0

Это верно для Windows, да. Я обновил ответ, чтобы понять это. –

+0

Большое спасибо. Однако мне понадобится независимое от платформы решение, так как мои скрипты могут работать как на Windows, так и на Linux-машинах. – steve

Смежные вопросы