通过pexpect发送命令时如何避免冗余?

拉玛娜·雷迪(Ramana Reddy)

我有一个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/

等等。

在这里观察到,/我有devhome作为变量。如果我home再次进入ramanadir作为变量。如果进入ramana那里又有xyzxxx所以基本上它是形式

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过 VBA 发送命令

来自分类Dev

通过python发送命令时键入Error

来自分类Dev

如何通过名称向机器人发送命令?

来自分类Dev

如何通过Java中的cmd发送命令?

来自分类Dev

.bat文件关闭时,我将如何发送命令?

来自分类Dev

Android通过蓝牙发送命令失败

来自分类Dev

向HSM发送命令时发出

来自分类Dev

如何发送命令到python脚本?

来自分类Dev

通过Bash脚本通过Telnet发送命令

来自分类Dev

通过Bash脚本通过Telnet发送命令

来自分类Dev

在面部跟踪期间,当 x 和 y 处于中心时如何发送命令?

来自分类Dev

Jsch-通过SSH连接发送命令

来自分类Dev

通过带有期望脚本的SSH发送命令

来自分类Dev

Jsch-通过SSH连接发送命令

来自分类Dev

通过ssh发送命令而不必等到离开终端的脚本

来自分类Dev

尝试通过子进程发送命令以使用 ffmpeg

来自分类Dev

如何在AutoHotKey中延迟发送命令?

来自分类Dev

如何直接从Windwos CMD向我的程序发送命令?

来自分类Dev

如何从非播放器对象UNET发送命令

来自分类Dev

如何自动从 Windows 向 Linux (WSL/Ubuntu) 发送命令?

来自分类Dev

向Telnet发送命令

来自分类Dev

向函数发送命令

来自分类Dev

我通过python中的串口发送命令,但它们被多次发送而不是一次

来自分类Dev

bash脚本:在命令内发送命令

来自分类Dev

使用Django模型继承时如何避免这种冗余?

来自分类Dev

在我断开连接之前,有没有办法通过蓝牙发送命令

来自分类Dev

通过串行端口连接到设备并发送命令,但未返回任何内容

来自分类Dev

通过TCP套接字发送命令的最佳方法是什么?

来自分类Dev

通过向屏幕会话发送命令来停止systemd服务

Related 相关文章

热门标签

归档