2016-03-18 4 views
0

Я работаю с PyYAML и мне нужно, чтобы описать конфигурацию сервера в YAML, а затем запустить сценарий с аргументами из этого списка:Как извлечь значения из списка python?

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) 

, а затем я звоню Баш скрипт с арг из этого списка:

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

Как я могу передать пользователям в этом случае? Количество пользователей может быть различным для каждого сервера, и мне нужно как-то передать его как args. Или может быть, что можно поставить имена пользователей с каждого сервера в список и сделать то же самое с паролями, а затем передать его как 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) 

Вы не можете поместить список в конце список строк в качестве первого аргумента a как @srowland:

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 Это просто еще один способ сделать список в строку, необходимую для предотвращения TypeError , – Anthon

+0

@ Энтон - спасибо, что я не заметил этого :). Я добавлю BigBoss в мой ответ, если кто-нибудь еще столкнется с этим. – srowland

Смежные вопросы