Python cookiecutter 遍历列表
Python cookiecutter loop over list
我正在尝试遍历 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 命令 - 每个元素一个命令。我正在尝试遍历列表,如 here or here.
所示
我想要的
这就是我想要的:cookiecutter create-server-tree
应该生成 webck.sh
其中包含以下内容:
mkdir -p ~/myproj/host_types/db
mkdir -p ~/myproj/host_types/web
如何遍历 servers
列表并使用每个列表元素(而不是一次使用一个字符)?
原来我用错了术语。如果键值对中的值是一个普通列表,则 cookiecutter 将该值(列表)称为提供“Multiple Choice options”。因此,如果我将一个普通列表作为键 "servers" 的值,那么我应该期望得到上面得到的选择列表:
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)。这是因为我 not 只能抑制字典变量的提示。我会想要这个:
directory_name[df-sharp]:
myweb_provisioner[webck]:
以及一些将键 servers
指定为默认参数的方法。实际上,他们有一个默认选项 here. It would be something like this and requires using 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"?我不知道。
我正在尝试遍历 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 命令 - 每个元素一个命令。我正在尝试遍历列表,如 here or here.
我想要的
这就是我想要的:cookiecutter create-server-tree
应该生成 webck.sh
其中包含以下内容:
mkdir -p ~/myproj/host_types/db
mkdir -p ~/myproj/host_types/web
如何遍历 servers
列表并使用每个列表元素(而不是一次使用一个字符)?
原来我用错了术语。如果键值对中的值是一个普通列表,则 cookiecutter 将该值(列表)称为提供“Multiple Choice options”。因此,如果我将一个普通列表作为键 "servers" 的值,那么我应该期望得到上面得到的选择列表:
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)。这是因为我 not 只能抑制字典变量的提示。我会想要这个:
directory_name[df-sharp]:
myweb_provisioner[webck]:
以及一些将键 servers
指定为默认参数的方法。实际上,他们有一个默认选项 here. It would be something like this and requires using 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"?我不知道。