Обновите /etc/sysctl.conf с помощью Python ConfigParser

Я могу использовать библиотеку Python ConfigParser для чтения /etc/sysctl.conf добавив [dummy] раздел и переопределение ConfigParser's read() метод следующим образом:

class SysctlConfigParser(ConfigParser.ConfigParser):
    def read(self, fn):
        text = open(fn).read()
        contents = StringIO.StringIO("[dummy]\n" + text)
        self.readfp(contents, fn)

Теперь самое сложное - записать обновления конфигурации, сделанные моей программой на python, потому что, если бы я сейчас вызывал ConfigParser.write() непосредственно тогда это добавит обратно [dummy] раздел также:

[dummy]
net.netfilter.nf_conntrack_max = 313
net.netfilter.nf_conntrack_expect_max = 640
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 5

Вот мои вопросы:

  1. Есть ли элегантный способ заставить ConfigParser не добавлять этот [фиктивный] раздел? Кажется странным, если бы мне пришлось открыть этот файл снова, чтобы удалить первую строку, содержащую этот фиктивный раздел.
  2. Может быть, ConfigParser не тот инструмент для редактирования sysctl.conf? Если да, то есть ли какие-либо другие библиотеки Python, которые позволили бы обновлять sysctl.conf удобным способом из Python?

1 ответ

ConfigParser предназначен для анализа файлов конфигурации в стиле INI. /etc/sysconf.conf это не такой файл.

Вы можете использовать привязки Augeas для Python, если вам нужен парсер, который работает "из коробки":

import augeas

aug = augeas.Augeas()
aug.set('/files/etc/sysctl.conf/net.ipv4.ip_forwarding', '1')
aug.set('/files/etc/sysctl.conf/fs.inotify.max_user_watches', '8192')
aug.save()

Формат файла довольно тривиален (просто коллекция <name> = <value> строки с необязательными комментариями).

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