我有一个python的pexpect代码,它在其中发送文件中列出的一些命令。
说我将一些命令存储在一个名为 commandbase
ls -l /dev/
ls -l /home/ramana
ls -l /home/ramana/xyz
ls -l /home/ramana/xxx
ls -l /home/ramana/xyz/abc
ls -l /home/ramana/xxx/def
ls -l /home/dir/
等等。
在这里观察到,/
我有dev
和home
作为变量。如果我home
再次进入ramana
并dir
作为变量。如果进入ramana
那里又有xyz
和xxx
。所以基本上它是形式
ls -l /variable1/variable2/variable3/
等等。在这里,我需要为每个变量及其特定的辅助变量构建一棵树。
现在,我应该有一个列表/数组/文件,将第一个变量及其辅助变量存储在另一个列表中,依此类推。
所以我需要这样的功能
在主脚本中
for line in database:
child.sendline(line+"\r")
child.expect("\$",timeout)
数据库文件应类似于:
def commands():
return "ls -l <some variable>/<second variable and so on>"
此函数应返回所有组合的所有命令
如何在这里返回变量命令而不是定义所有命令?数组或列表可能吗?
[编辑]修改不清楚。希望我这次清楚
您的要求比乍看起来要复杂一些。下面,我采用了一种约定,即使用列表[...]
表示要连接的事物,使用元组(...)
表示要选择的事物,即可选项。
您的路径名列表现在可以表示为:
database = (
'dev',
['home', (
'dir',
['ramana', (
'',
['xyz', (
'',
'abc'
)
],
['xxx', (
'',
'def'
)
]
)
]
)
]
)
上面的语法尽可能避免了冗余。空格不是必需的,但是在这里有助于说明哪些部分在同一嵌套级别上。
接下来,我们需要一种将其转换为命令列表的方法:-
def permute(prefix, tree):
def flatten(branch):
#print 'flatten', branch
results = [ ]
if type(branch) is list:
parts = [ ]
for part in branch:
if type(part) is basestring:
if part:
parts.append([part])
else:
parts.append(flatten(part))
index = map(lambda x: 0, parts)
count = map(len, parts)
#print 'combining', parts, index, count
while True:
line = map(lambda i: parts[i][index[i]],
range(len(parts)))
line = '/'.join(line)
#print '1:', line
results.append( line )
curIndex = len(parts)-1
while curIndex >= 0:
index[curIndex] += 1
if index[curIndex] < count[curIndex]:
break
index[curIndex] = 0
curIndex -= 1
if curIndex < 0:
break
elif type(branch) is tuple:
for option in branch:
if type(option) is basestring:
if len(option):
#print '2:', option
results.append( option )
else:
results.extend(flatten(option))
else:
#print '3:', branch
results.append( branch )
return results
return map(lambda x: prefix + x, flatten(tree))
现在,如果我们调用permute('ls -l /', database)
它,它将返回以下列表:
[
'ls -l /dev',
'ls -l /home/dir',
'ls -l /home/ramana/',
'ls -l /home/ramana/xyz/',
'ls -l /home/ramana/xyz/abc',
'ls -l /home/ramana/xxx/',
'ls -l /home/ramana/xxx/def'
]
从这里开始,将这些字符串写到一个名为文件commandbase
或逐行执行的文件变得很简单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句