编程语言
首页 > 编程语言> > python-通过pexpect发送命令时如何避免冗余?

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