Как преобразовать файл конфигурации Python 3.6 в код argparser - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть файл .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.

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

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

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

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

0 голосов
/ 13 ноября 2018

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

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

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

    • написать новый скрипт
    • пройти в пути конфигурации
    • запустите волшебную часть, которая выводит теперь проанализированный объект 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)
...