Python cookiecutter 循环遍历列表

ede*_*esz 5 bash jinja2 python-2.7 cookiecutter

我正在尝试遍历 Python cookiecutter json 列表中的所有项目,并基于每个项目运行 bash 命令。

设置

我有以下几点cookiecutter.json

{
    "directory_name": "df-sharp",
    "servers": ["db", "web"],
    "myweb_provisioner": "webck"
}
Run Code Online (Sandbox Code Playgroud)

我有{{cookiecutter.myweb_provisioner}}.sh,其中包含此jinja2代码:

{% for server in cookiecutter.servers %}
mkdir -p ~/myproj/host_types/{{ server }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

问题

当我运行时cookiecutter create-server-tree,我得到以下信息:

Select servers:
1 - db
2 - web
Choose from 1, 2 [1]: 2
Run Code Online (Sandbox Code Playgroud)

和内容webck.sh是:

mkdir -p ~/myproj/host_types/w
mkdir -p ~/myproj/host_types/e
mkdir -p ~/myproj/host_types/b
Run Code Online (Sandbox Code Playgroud)

Select不应该出现的菜单。我不想在列表中的 2 个元素之间进行选择。我想遍历它们并构造 2 个 bash 命令 - 每个元素一个命令。我正在尝试遍历列表,如此此处所示。

我想要的是

这就是我想要的:cookiecutter create-server-tree应该生产webck.sh包含以下内容:

mkdir -p ~/myproj/host_types/db
mkdir -p ~/myproj/host_types/web
Run Code Online (Sandbox Code Playgroud)

如何遍历servers列表并使用每个列表元素(而不是一次一个字符)?

ede*_*esz 3

事实证明我使用了错误的术语。如果键值对中的值是一个普通列表,则 cookiecutter 将该值(列表)称为提供“多项选择选项”。因此,如果我输入一个简单的列表作为关键“服务器”的值,那么我应该期望得到上面得到的选择列表:

Select servers:
1 - db
2 - web
Choose from 1, 2 [1]: 2
Run Code Online (Sandbox Code Playgroud)

我需要的是一个嵌套字典作为关键服务器的值,就像它们在这里显示的那样- 它称为字典变量。为了用它来回答我的问题,我将cookiecutter.json文件更改为:

{
    "directory_name": "df-sharp",
    "servers": {"server_list": ["db", "web"],
                "server_ips: ["123", "456"]"
               },
    "myweb_provisioner": "webck"
}
Run Code Online (Sandbox Code Playgroud)

然后我使用jinja2,如下所示:

{% for server in cookiecutter.servers.server_list %}
mkdir -p ~/myproj/host_types/{{ server }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这给了我我想要的。

但是,我不得不使用cookiecutter create-server-tree --no-input链接)。这是因为我无法抑制字典变量的提示。我想要这个:

directory_name[df-sharp]: 
myweb_provisioner[webck]: 
Run Code Online (Sandbox Code Playgroud)

以及将键指定servers为默认参数的某种方法。实际上,他们这里有一个默认选项。它会是这样的,并且需要使用他们的 API

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

但是,用户应该如何将此extra_content={...}参数合并到实际的 cookiecutter 项目中并在模板化脚本中引用“server_list” jinja2?我不知道。