Python cookiecutter循环遍历列表

6

我希望能够循环遍历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

选择菜单不应出现。 我不想在列表中选择两个元素之间。 我想循环遍历它们并构建2个bash命令 - 每个元素一个命令。 我试图像这里这里所示的那样循环列表。 我的要求 这就是我想要的: cookiecutter create-server-tree 应该生成包含以下内容的webck.sh
mkdir -p ~/myproj/host_types/db
mkdir -p ~/myproj/host_types/web

我该如何迭代 servers 列表并使用列表中的每个元素(而不是逐个字符)?
1个回答

3

原来我使用的术语不正确。如果键值对中的值是一个普通列表,则cookiecutter将该值(列表)称为提供“多选项”。因此,如果我将普通列表作为键“servers”的值输入,则应该预期获得上面所述的选择列表:

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

我需要的是将嵌套字典作为关键字“servers”的值,就像这里所展示的那样——它被称为Dictionary Variables。为了回答我的问题,我将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项目中,并在jinja2 模板化的脚本中引用“server_list”? 我不清楚。


您可以通过创建嵌套的Cookiecutters来禁用特定选项的提示 - 外部Cookiecutter应该直接由用户使用,它将使用额外的上下文渲染cookiecutter.json文件,内部Cookiecutter将使用这些渲染后的选项和--no-input参数由外部Cookiecutter的post gen hook调用。https://cookiecutter.readthedocs.io/en/latest/advanced/hooks.html(虽然这有点丑陋,但是在这一点上,Cookiecutter既不是非常灵活也不是复杂的)。 - Bob
这个想法相当笨重,但很有趣。它的优点是不需要额外的上下文信息。谢谢! - edesz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接