如何从列表 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
我正在使用 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