【问题标题】:Python cookiecutter loop over listPython cookiecutter 循环遍历列表
【发布时间】:2017-11-24 04:03:43
【问题描述】:

我正在尝试遍历 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 个元素之间进行选择。我想遍历它们并构造 2 个 bash 命令——每个元素一个命令。我正在尝试遍历列表,如 herehere 所示。

我想要什么

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

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

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

【问题讨论】:

    标签: bash python-2.7 jinja2 cookiecutter


    【解决方案1】:

    原来我使用了错误的术语。如果键值对中的值是一个普通列表,那么 cookiecutter 将该值(列表)称为提供“Multiple Choice options”。因此,如果我将一个普通列表作为键“服务器”的值,那么我应该期望得到我上面得到的选择列表:

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

    我需要一个嵌套字典作为密钥服务器的值,就像它们显示的 here - 它称为字典变量。为了用它来回答我的问题,我将我的 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(link)。这是因为我 只能抑制字典变量的提示。我本来想要这个:

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

    以及将键 servers 指定为默认参数的某种方式。实际上,他们有一个默认选项here。它会是这样的,需要使用their 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.json,然后将调用内部的这些呈现的选项和 --no-input 由外部的 post gen hook cookiecutter.readthedocs.io/en/latest/advanced/hooks.html (虽然这有点难看,但 cookiecutter 在这一点上既不灵活也不复杂)
    • 这会很笨拙,但这是一个有趣的想法。它的优点是不需要extra context。谢谢!
    猜你喜欢
    • 2018-10-26
    • 2019-04-15
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多