argparse仅返回1个名称空间

时间:2017-02-16 16:30:06

标签: argparse

我正在尝试为远程服务器上执行的以下.py文件获取多个名称空间:

cmd = 'ssh root@{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]','[2,','3,','1,','1,',' 5,','2,','4,','4]','[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-000000bc ,','instance-000000c0,','instance-000000bf,','instance-000000c0]']

只有一个名称空间与此相关联:

  

命名空间(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]','[2,','3,','1,','1,',' 5,','2,','4,','4]','[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-000000bc ,','instance-000000c0,','instance-000000bf,','instance-000000c0]'])

这在我看来是一个嵌套列表。我想为这个嵌套列表中的每个列表设置不同的命名空间,但没有成功。我尝试使用单独的parser.add_argument和单独的dest = xyz,但没有成功。有人可以帮忙吗?我的要求是为每个列表设置不同的命名空间。

1 个答案:

答案 0 :(得分:0)

args = parser.parse_args()会返回argparse.Namespace个对象。在您的情况下,它会生成一个具有一个属性args.from_vm

的对象

from_vm是一个Namespace对象的属性。我认为您不需要多个“名称空间”,而是需要一个子列表列表,或者可能是多个属性,每个属性都有自己的字符串列表。

该属性是64个字符串的列表。第一个元素是`'[myvm-r1-1,',它看起来像嵌套列表的开头,但不是。它只是一个字符串。

看看sys.argv。解析器使用sys.argv[1:]中的字符串列表。该列表由shell和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 ...

即代替包含,个单独字词的列表列表;使用标志分隔列表,并省略[],