用python cmd模块实现一个unix管道?

时间:2011-10-22 12:58:01

标签: python windows shell cmd pipe

我使用python的cmd模块实现了一个简单的shell 现在,我想在这个shell中实现一个unix管道,就是当我输入:

ls | grep "a"  

它会将do_ls的结果传递给do_grep的输入,
最简单的方法是什么?
对不起CryptoJones,我忘了说我的平台是Windows。

4 个答案:

答案 0 :(得分:2)

最简单的方法可能是将do_ls的输出存储在缓冲区中并将其提供给do_grep。您可能希望逐行或按行组进行操作,而不是一次性完成,特别是如果要实现more命令。

更完整的方法是在子流程中运行所有命令,并依赖现有的标准库模块进行管道支持,例如: subprocess

答案 1 :(得分:2)

您可能想要使用cmd2模块。它是cmd的替代品,具有其他功能。

请参阅其文档的Output redirection部分。

答案 2 :(得分:2)

这是一个可以帮助您的简单示例:

from cmd import Cmd

class PipelineExample(Cmd):

    def do_greet(self, person):
        if person:
            greeting = "hello, " + person
        else:
            greeting = 'hello'
        self.output = greeting

    def do_echo(self, text):
        self.output = text

    def do_pipe(self, args):
        buffer = None
        for arg in args:
            s = arg
            if buffer:
                # This command just adds the output of a previous command as the last argument
                s += ' ' + buffer
            self.onecmd(s)
            buffer = self.output

    def postcmd(self, stop, line):
        if hasattr(self, 'output') and self.output:
            print self.output
            self.output = None
        return stop

    def parseline(self, line):
        if '|' in line:
            return 'pipe', line.split('|'), line
        return Cmd.parseline(self, line)

    def do_EOF(self, line):
        return True

if __name__ == '__main__':
    PipelineExample().cmdloop()

以下是一个示例会话:

(Cmd) greet wong
hello, wong
(Cmd) echo wong | greet
hello, wong
(Cmd) echo wong | greet | greet
hello, hello, wong

答案 3 :(得分:1)

使用内置管道功能,而不是cmd。

http://docs.python.org/library/pipes.html