如何从列表 python 中提取值?

How to extract values from list python?

我正在使用 pyyaml,我需要在 yaml 中描述服务器配置,然后 运行 使用此列表中的参数编写脚本:

servers:
  - server: server1
    hostname: test.hostname
    url: http://test.com
    users:
    - username: test
      password: pass
    - username: test1
      password: pass2
  - server: server2
    hostname: test.hostname2
    url: http://test2.com
    users:
    - username: test3
      password: pass
    - username: test4
      password: pass2
    - username: test5
      password: pass6
...

然后我从 yaml 中获取这些数据:

source = self._tree_read(src, tree_path)

然后我使用此列表中的参数调用 bash 脚本:

for s in source['servers']:
    try:
        subprocess.call(["/bin/bash", "./servers.sh",
                         s["server"],
                         s["hostname"],
                         s["url"],
                       **s["users"]**
                        ], shell=False)

这种情况下如何传递用户?每个服务器的用户数量可能不同,我需要以某种方式将其作为参数传递。 或者是否可以将每个服务器的用户名放入列表,并对密码执行相同操作,然后将其作为 2 个参数和 2 个列表传递?

您可以添加一个变量来保存用户:

for s in source["servers"]:
    # add any processing in the list comp to extract users
    user_list = [user["username"] for user in s["users"]]
    try:
        subprocess.call(["/bin/bash", "./servers.sh",
                         s["server"],
                         s["hostname"],
                         s["url"],
                         ",".join(user_list),
                         ], shell=False)

您需要修改 listcomp 以从 s["users"] 中提取您想要的字段。

您应该将命令构建到一个变量中并将其扩展到所有用户:

    cmd = ["/bin/bash", "./servers.sh", 
                     s["server"],
                     s["hostname"],
                     s["url"],
                    ]
    cmd.extend(s["users"])

然后调用 call

    subprocess.call(cmd, shell=False)

您不能像@srowland 那样将列表放在字符串列表的末尾作为第一个参数 a:

subprocess.call(['/bin/bash', 'echo', 'hello', ['good', 'evening']], shell=False)

将提出 child_exception:

TypeError: execv() arg 2 must contain only strings