Как преобразовать файл конфигурации Python 3.6 в код argparser

У меня есть файл .conf, который я загружаю в python с помощью ConfigParser(). Файл conf имеет обычный формат (также с использованием opencv):

[decorations]
timestamp_fg= 255,255,255
timestamp_bg= 0,0,0
font_scale = 1.5

Файл conf большой. Мне нужен способ автоматически генерировать код python для ArgumentParser(), чтобы я мог один раз создать файл conf, сгенерировать код и удалить код, который мне не нужен:

parser = argparse.ArgumentParser()
parser.add_argument("-c","--config", help="full pathname to config file", type=str)
# etc.

Я не нашел такой утилиты, но на питоне всего несколько месяцев.


person PeterB    schedule 12.11.2018    source источник


Ответы (2)


Хотя я не совсем уверен, я бы сделал одно из двух.

  • Создайте функцию, которая принимает ConfigParser объект и преобразует его в эквивалент Argparse.

    • amend tool
    • работать нормально
    • запустите волшебную часть, которая сбрасывает теперь проанализированный объект ConfigParser в виде большой строки команд Argparse в новом файле для вашего удовольствия от просмотра
  • Напишите для него регулярное выражение и выполните прямое преобразование

    • write a new script
    • пройти по пути конфига
    • запустите волшебную часть, которая сбрасывает теперь проанализированный объект ConfigParser в виде большой строки команд Argparse в новом файле для вашего удовольствия от просмотра

Простое использование string.format(), вероятно, нормально

# make a template for your Argparse options
GENERIC_COMMAND = """\
parser.add_argument(
        "--{long_name}", "-{short_name}",
        default="{default}",
        help="help_text")"""

...
# parse ConfigParser to commands
commands = [
    {
        "long_name": "argumentA",
    },
    {
        "long_name": "argumentB",
        "help_text": "Do Thing B"
    },
...
]

commands_to_write_to_file = []
for command in commands:
    try:
        commands_to_write_to_file.append(
            GENERIC_COMMAND.format(**command))  # expand command to args
    except Exception as ex:
        print("Caught Exception".format(repr(ex)))

# to view your commands, you can write commands to file
# or try your luck with the help command
with open(out.txt, "w") as fh:
    fh.write("\n\n".join(commands_to_write_to_file))

Ни одно из этих решений не является хорошим решением, но я ожидаю, что 90% работы будет выполнено легко, оставив хорошее ведение журнала и себя, чтобы найти и преобразовать оставшиеся несколько странных команд.

Как только вы будете довольны результатом, вы можете избавиться от логики дампа и вместо этого заполнить аргументы argparse непосредственно ими.

for command in commands:
    argparse.add_argument(**command)
person ti7    schedule 12.11.2018
comment
Да, я понял, что конфиг представлен в виде словаря, поэтому его легко перемещать, учитывая, что части статичны или используются re для поиска. Я также увидел, что я могу использовать json в качестве формата файла конфигурации, который также прост в обращении. - person PeterB; 14.11.2018

Я бы проверил ConfigArgParse. Эта библиотека позволяет

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

person Wyrmwood    schedule 12.11.2018
comment
который выглядит многообещающе, даст ему обзор. - person PeterB; 14.11.2018