2017-02-16 8 views
2

Я пытаюсь получить несколько пространств имен для следующего .py файла, который выполняется на удаленном сервере:argparse возвращает вложенные значения только 1 имен

cmd = 'ssh [email protected]{0} 2>/dev/null "/root/abc.py {1} {2} {3} {4} {5} {6} {7} {8}"'.format(hostname, from_vm, to_vm, from_slot, to_slot, from_port, to_port, from_vm_inst, to_vm_inst) 

За исключением имени хоста, все остальные объекты являются списками.

В abc.py, у меня есть следующий код:

parser = argparse.ArgumentParser() 
parser.add_argument(nargs='+', dest='from_vm', 
        help='list of name of source VMs') 
print("List of items: {}".format(args.from_vm)) 

Это возвращает мне следующее:

Список элементов: [ '[myvm-R1-1,', ' myvm-r1-1, ',' myvm-r2-1, ',' myvm-r1-1, ',' myvm-r1-1, ',' myvm-r2-1, ',' myvm-r2-1 , 'myvm-r1-1]', 'myvm-r2-1,', 'myvm-r2-1,', 'myvm-spt', 'myvm-spt', 'myvm-r1- 1, ',' myvm-spt, ',' myvm-r2-1, ',' myvm-spt] ',' [1, ',' 1, ',' 1, ',' 1, ',' 1 , ',' 1, ',' 1, ',' 1] ',' [1, ',' 1, ',' 1, ',' 1, ',' 1, ',' 1, ',', 1, 1, 1, 1, 2, 3, '[3,', '6,', '1,', '3,', '6,', '4 , ',', '5,', '2]', '[instance-000000bc,', 'instance-000000bc,', 'instance-000000bf,', 'instance-000000bc,', 'instance-000000bc,', instance-000000bf, ',' instance-000000bf, ',' instance-000000bc] ',' [instance-000000bf, ',' instance-000000bf, ',' instance-000000c0, ',' instance-000000c0, ',' instance-000000c0, ', экземпляр-000000bc, ', 'экземпляр-000000c0,', 'экземпляр-000000bf,', 'экземпляр-000000c0]']

Существует только 1 имена, связанные с этим:

пространство имен (from_vm = ['[myvm-r1-1,', 'myvm-r1-1,', 'myvm-r2-1,', 'myvm-r1-1,', 'myvm-r1-1,', 'myvm-r1-1,', myvm-r2-1, ',' myvm-r2-1, ',' myvm-r1-1] ',' [myvm-r2-1, ',' myvm-r2-1, ',' myvm-spt, ',' myvm-spt ',' myvm-r1-1 ',' myvm-spt ',' myvm-r 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ',' [1, ',' 1, ',' 1, ',' 1, ',' 1, ',' 1, ',' 1, ',' 1] ',' [2, , '3,', '1,', '1,', '5,', '2,', '4,', '4]', '[3,', '6,', '1, ',' 3, ',' 6, ',' 4, ',' 5, ',' 2] ',' [instance-000000bc, ',' instance-000000bc, ',' instance-000000bf, ', экземпляр-000000bc, ',' instance-000000bc, ',' instance-000000bf, ',' instance-000000bf, ',' instance-000000bc] ',' [instance-000000bf, ',' instance-000000bf, ', экземпляр-000000c0, ', 'экземпляр-000000c0,', 'экземпляр-000000bc,', 'экземпляр-000000c0,', 'экземпляр-000000bf,', 'экземпляр-000000c0]'])

Это проявляется для меня как вложенный список. Я хочу иметь разные пространства имен для каждого списка внутри этого вложенного списка, но без успеха. Я пробовал использовать отдельный parser.add_argument с отдельным dest = xyz, но без успеха. Может ли кто-нибудь помочь? Мое требование состоит в том, чтобы иметь разные пространства имен для каждого списка.

+0

Если вы пропустили команду 'args = parser.parse_args()' из вашего образца кода? – hpaulj

+0

@hpaulj, у меня есть это в моем коде, именно так я не упомянул об этом в приведенном выше примере. –

ответ

0

args = parser.parse_args() возвращает argparse.Namespace объект. В вашем случае он создает объект с одним атрибутом, args.from_vm.

from_vm является атрибутом одного объекта пространства имен. Я не думаю, что вам нужно несколько «пространств имен», а список списков подписок или может быть несколькими атрибутами, каждый со своим собственным списком строк.

Этот атрибут представляет собой список из 64 строк. Первым элементом является `` [myvm-r1-1, ', который выглядит как начало вложенного списка, но это не так. Это просто строка.

Посмотрите на sys.argv. Парсер работает со списком строк в sys.argv[1:]. Этот список определяется интерпретатором оболочки и python.

С nargs='+', парсер просто сохраняет этот полный список атрибуту from_vm - как есть, без изменений.

Если вам не нравится, что находится в sys.argv[1:], попробуйте добавить цитаты в командной строке. Сделано правильно, что передаст все это в виде одной строки, которую вы сможете проанализировать по-своему. JSON используется для обработки общих строк, которые выглядят как вложенные списки и/или словари.

Другой вариант - написать этот список как вывод в файл, а также прочитать и разобрать его отдельно. Передача его через командную строку и argparse, вероятно, не стоит усилий. Используйте их для простых входов, таких как имя файла.

Я сделал ' '.join(args.from_vm) на копировальном-н-паста вашего поста, и получил

In [123]: txt=' '.join(_) 
In [124]: txt 
Out[124]: '[myvm-r1-1, myvm-r1-1, myvm-r2-1, myvm-r1-1, myvm-r1-1, myvm-r2-1, myvm-r2-1, myvm-r1-1] [myvm-r2-1, ...instance-000000c0]' 

Это не собирается быть легко разбора, даже если вы можете загрузить его в одну строку.

Было бы намного проще разобрать, если вы можете форматировать строку ввода, как

--arg1 myvm-r1-1 myvm-r1-1 myvm-r2-1 myvm-r1-1 myvm-r1-1 myvm-r2-1 myvm-r2-1 myvm-r1-1 
--arg2 myvm-r2-1 myvm-r2-1 myvm-spt myvm-spt myvm-r1-1 myvm-spt myvm-r2-1 myvm-spt 
--arg3 1 1 1 1 1 1 1 1 
--arg4 1 1 1 1 1 1 1 1 ... 

То есть, вместо того, чтобы список списков с , отдельных терминов; отделите списки с флагами и опустите [],.

+0

Я использовал sys.argv [1:], а затем использовал '.join (sys.argv [1:]), который создал строку после удаления кавычек. Затем я использовал, слэш [(. *?) Slash] pattern match, чтобы разделить квадратные фигурные скобки. Затем я использовал split (",") для этого совпадающего шаблона, чтобы преобразовать его обратно в список. Это послужило моей цели. Спасибо, hpaulj за помощь. –