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

Я пытаюсь перебрать все элементы в списке json Python cookiecutter и запустить команду 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 элементами в списке. Я хочу зациклить их и построить 2 команды bash - по одной команде на элемент. Я пытаюсь перебрать список, как показано здесь или здесь.

Что я хочу

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

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

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

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 шаблонный скрипт? Я не знаю.

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