2017-02-16 52 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-R 1-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' 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]','[2','3','1','1','5','2','4','4]', '[3,','6,','1,','3,','6,','4 '實例000000bc'實例000000bc'實例000000bf'實例000000bc'實例000000bc','實例000000bc','實例000000bc','實例000000bc','實例000000bc','實例000000bf','實例000000bf','實例000000bc]','實例000000bf','實例000000bf','實例000000c0','實例000000c0','實例000000bc,', '實例000000c0,', '實例000000bf,', '實例000000c0]']

只有1與此相關聯的名稱空間:

命名空間( 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-r 2-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','實例000000bc','實例000000bc','實例000000bf','實例000000bf','實例000000bc]','[實例000000bf','實例000000bf','實例000000c0,', '實例000000c0,', '實例000000bc,', '實例000000c0,', '實例000000bf,', '實例000000c0]'])

這似乎對我來說是一個嵌套列表。我想爲這個嵌套列表中的每個列表都有不同的名稱空間,但沒有成功。我嘗試使用單獨的dest = xyz單獨的parser.add_argument,但沒有成功。有人可以幫忙嗎?我的要求是爲每個列表都有不同的名稱空間。

+0

DId你從代碼示例中省略了'args = parser.parse_args()'命令? – hpaulj

+0

@hpaulj,我在我的代碼中,它只是我沒有在上面的例子中提到它。 –

回答

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 ... 

也就是說,而不是用,單獨的條款列出的清單;將列表與標誌分開,並省略[],

+0

我使用了sys.argv [1:],然後使用''.join(sys.argv [1:]),它在刪除引號後生成了一個字符串。然後,我使用斜線[(。*?)斜線]模式匹配來劃分方括號。然後我使用split(「,」)將這個匹配的模式轉換回列表。這符合我的目的。謝謝hpaulj的幫助。 –