Перезапись файла конфигурации во время выполнения - PullRequest
0 голосов
/ 19 октября 2018

Я использую файлы конфигурации через configparser в python3.7.1.
У меня есть переменная в одном из файлов, который я хотел бы изменить во время выполнения, и мне было интересно, как лучше всего это сделать.

Прямо сейчас я переписываю весь файл следующим образом:

config = configparser.ConfigParser()
config.read('config.ini')
config['Categorie']['new_variable'] = variable
with open('config.ini', 'w') as configfile:
    config.write(configfile)

У меня есть 2 проблемы с этим методом:
- потенциально потеря конфигурации при ошибке
- удаление комментариев в пределахфайл каждый раз

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

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

config.ini

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = {somelevel}
ForwardX11 = yes

код Python

content = open('config.ini').read()
somelevel = 34
filled = content.format(**locals())
gg = ConfigParser()
gg.read_string(filled)

Однако NOT используйте ** locals () для реального кода.Попробуйте найти лучший способ, это грязно.

edit: я попытался сделать несколько простых взломов f-строк, они терпят неудачу из-за проблем с выходом.

0 голосов
/ 19 октября 2018

configparser не хранит комментарии, так что вы застряли на этом, если только вы не не используете этот модуль ... Или вы можете извлечь комментарии и затем повторно внедрить их в файл(теряя позицию комментариев, но сохраняя содержимое)

Чтобы не потерять конфигурацию в случае ошибки (переполнение диска или другое), вы можете сохранить другое имя, удалить текущий файл и переименовать.

conf_file = 'config.ini'
with open(conf_file+'.bak', 'w') as configfile:
    config.write(configfile)
if os.path.exists(conf_file):
   os.remove(conf_file)  # else rename won't work when target exists
os.rename(conf_file+'.bak',conf_file)

этот метод безопасен.Если файл не может быть записан, предыдущий файл не засорен.В худшем случае (если кто-то потянет штекер в момент точного , когда исходный файл будет удален), файл .bak (с соответствующим новым содержимым) останется.

Альтернативой может бытьпереименуйте существующий INI-файл, запишите новый и удалите старый INI-файл, если файл был успешно записан.

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

...