python-通过pexpect发送命令时如何避免冗余?
作者:互联网
我有一个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作为变量之后.如果我再次在家中,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的文件或逐行执行它很简单.
标签:pexpect,python 来源: https://codeday.me/bug/20191119/2034871.html