2016-03-18 116 views
0

我與pyyaml工作,我需要描述YAML中的服務器配置,然後從該列表參數運行腳本:如何從列表python中提取值?

source = self._tree_read(src, tree_path) 

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得到這個數據

,然後我從這個名單調用帶有ARGS 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個列表一起傳遞?

回答

1

您可以添加一個變量來保存用戶:

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"]想要的字段。

1

你應該建立命令到一個變量和擴大與所有用戶:

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 
+0

在subprocess.call我把: 「」加盟(USER_LIST) – BigBoss

+0

@BigBoss也就是說上榜到既要防止類型錯誤字符串的另一種方式。 – Anthon

+0

@安永 - 謝謝我沒有發現那個:)。如果有其他人遇到這種情況,我會將BigBoss的加入到我的答案中。 – srowland