#python #bind #pyparsing #dhcp
#pyparsing
Вопрос:
Что было бы лучшей практикой — если таковая существует — для анализа нескольких файлов конфигурации?
Я хочу проанализировать конфигурацию сервера mysql, а также записать конфигурацию снова.
Конфигурация позволяет выдавать несколько строк, таких как:
!includedir /etc/mysql.d/
Итак, интересно то, что некоторые конфигурации могут быть расположены в основном файле, но другие могут быть расположены во вложенном файле.
Я думаю, что pyparsing работает только с одним файлом или одной строкой содержимого.
Поэтому мне, вероятно, сначала нужно прочитать все файлы и, возможно, реструктурировать содержимое, например, добавив заголовки для разных файлов…
====main file====
[mysql]
....
!includedir /etc/mysql.d/
====/etc/mysql.d/my.cnf====
[client]
.....
У меня был бы только один вызов pyparsing.
Тогда я мог бы разобрать все в один объект больших данных, сгруппировать разделы файлов и использовать имена файлов в качестве ключей. Таким образом, я мог бы также записать данные обратно на диск…
Другой возможностью было бы проанализировать основной файл и программно проанализировать все другие файлы, которые были найдены в основном файле. Таким образом, у меня было бы несколько вызовов pyparsing.
Что вы думаете?
Ответ №1:
В вашем коде pyparsing прикрепите действие синтаксического анализа к выражению, которое соответствует include
операторам, попросите его проанализировать содержимое файлов, на которые даны ссылки, или каталога файлов, затем объедините эти результаты с текущими выводами синтаксического анализа. Действие parse будет выполнять последовательные вызовы parseString
, ваш код будет выполнять только один вызов.
Смотрите этот новый пример, добавленный в каталог примеров pyparsing:https://github.com/pyparsing/pyparsing/blob/master/examples/include_preprocessor.py
Комментарии:
1. Большое спасибо за ваши подсказки. Я рассмотрю это позже и отвечу соответствующим образом!
2. Итак, в принципе, любые данные, которые необходимо передать обратно родительскому вызывающему (из функции, выполняемой через его
setParseAction
), должны храниться вне класса pyparsing? Или мы можем использовать оператор ‘return value` внутри функции setParseAction? «`3. Я не совсем понимаю вопрос, но действия синтаксического анализа часто возвращают значения, которые создаются внутри, или даже изменяют проанализированные результаты на месте. В репозитории GitHub для pyparsing есть несколько примеров ( github.com/pyparsing/pyparsing ), которые показывают, как работать с действиями синтаксического анализа. SO не предназначен для вопросов и ответов в этих потоках чата. Попробуйте написать то, о чем вы думаете, и, если это не работает, отправьте новый вопрос.
4. После просмотра примера pyparsing ближайший, который я нашел, еще не реализован в verilog. github.com/pyparsing/pyparsing/blob/… Не понял, как вставить этот дополнительный поток данных, где находятся инструкции include.
5. Ну, macroExpander.py в том же духе, но ‘#include’ немного отличается, поэтому я добавлю этот пример в следующий выпуск :: github.com/pyparsing/pyparsing/blob/master/examples/… Работает только в Python 3.x, поскольку он использует pathlib.