Цикл Python cookiecutter по списку

Я пытаюсь перебрать все элементы в списке Python cookiecutter json и запустить команду bash на основе каждого элемента.

Настройка

У меня есть следующее cookiecutter.json:

{
    "directory_name": "df-sharp",
    "servers": ["db", "web"],
    "myweb_provisioner": "webck"
}

У меня есть {{cookiecutter.myweb_provisioner}}.sh, который содержит этот код jinja2:

{% for server in cookiecutter.servers %}
mkdir -p ~/myproj/host_types/{{ server }}
{% endfor %}

Проблема

Когда я запускаю cookiecutter create-server-tree, я получаю следующее:

Select servers:
1 - db
2 - web
Choose from 1, 2 [1]: 2

и содержимое в webck.sh:

mkdir -p ~/myproj/host_types/w
mkdir -p ~/myproj/host_types/e
mkdir -p ~/myproj/host_types/b

Меню Select не должно появляться. Я не хочу выбирать между двумя элементами в списке. Я хочу перебрать их и создать 2 команды bash - по одной команде на элемент. Я пытаюсь просмотреть список, как показано здесь или здесь.

Что я хочу

Это то, что я хочу: cookiecutter create-server-tree должен создать webck.sh, который содержит следующее:

mkdir -p ~/myproj/host_types/db
mkdir -p ~/myproj/host_types/web

Как я могу перебрать список servers и использовать каждый из элементов списка (вместо одного символа за раз)?


person edesz    schedule 24.11.2017    source источник


Ответы (1)


Оказывается, я использовал неправильную терминологию. Если значение в паре ключ-значение представляет собой простой список, то cookiecutter вызывает это значение (список) как предоставление «Множественный выбор вариантов". Итак, если я введу простой список в качестве значения для ключа «серверы», я должен ожидать получить список вариантов, который я получил выше:

Select servers:
1 - db
2 - web
Choose from 1, 2 [1]: 2

Мне нужен был вложенный словарь в качестве значения для серверов ключей, как они показывают здесь — это называется словарными переменными. Чтобы использовать это для ответа на мой вопрос, я изменил свой файл cookiecutter.json на это:

{
    "directory_name": "df-sharp",
    "servers": {"server_list": ["db", "web"],
                "server_ips: ["123", "456"]"
               },
    "myweb_provisioner": "webck"
}

а затем я использовал jinja2, как показано ниже:

{% for server in cookiecutter.servers.server_list %}
mkdir -p ~/myproj/host_types/{{ server }}
{% endfor %}

и это дало мне то, что я хотел.

Однако мне пришлось использовать cookiecutter create-server-tree --no-input(ссылку). Это потому, что я не смог подавить только приглашение для переменной словаря. Я бы хотел этого:

directory_name[df-sharp]: 
myweb_provisioner[webck]: 

и какой-то способ указать ключ servers в качестве аргумента по умолчанию. На самом деле у них есть опция по умолчанию здесь . Это будет примерно так и требует использования их API:

cookiecutter('create-server-tree/',
             no_input=True,
             extra_context={"servers": {"server_list":['db','web'],
                                        "server_ips": ["123", "456"]
                                       }
                           }
            )

Однако как пользователю включить этот аргумент extra_content={...} в реальный проект cookiecutter и обратиться к "server_list" в шаблонном сценарии jinja2? Я не знаю.

person edesz    schedule 28.11.2017
comment
вы можете подавить подсказки для определенных параметров, создав вложенные cookiecutters - внешний, который должен непосредственно использоваться вашим пользователем, будет отображать cookiecutter.json с дополнительным контекстом, затем внутренний будет вызываться с этими отображаемыми опциями и --no- ввод внешним постгенерирующим хуком cookiecutter.readthedocs.io/en/latest/ advanced/hooks.html (хотя это довольно уродливо, но на данный момент cookiecutter не очень гибкий и сложный) - person Bob; 22.07.2019
comment
Это было бы довольно громоздко, но это интересная идея. Это имело бы то преимущество, что дополнительный context не требуется. Спасибо! - person edesz; 22.07.2019