реализовать канал Unix с модулем Python CMD? - PullRequest
3 голосов
/ 22 октября 2011

Я реализую простую оболочку, используя модуль cmd в python.
Теперь я хотел бы реализовать конвейер Unix в этой оболочке, то есть когда я набираю:

ls | grep "a"  

он передаст результат do_ls на вход do_grep,
Какой самый простой способ сделать это?
Извините, CryptoJones, я забыл сказать, что моей платформой является Windows.

Ответы [ 4 ]

2 голосов
/ 22 октября 2011

Вот простой пример, который может вам помочь:

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
2 голосов
/ 22 октября 2011

Простейший способ, вероятно, состоит в том, чтобы сохранить выходные данные вашего do_ls в буфере и передать его в do_grep. Возможно, вы захотите делать это построчно или по группам строк, а не за один раз, особенно если вы хотите реализовать команду more.

Более полный подход состоял бы в том, чтобы запускать все ваши команды в подпроцессах и полагаться на существующий стандартный модуль библиотеки для поддержки конвейера, например subprocess.

2 голосов
/ 22 октября 2011

Возможно, вы захотите использовать модуль cmd2 . Это замена для cmd с дополнительными функциями.

См. Раздел Перенаправление вывода своей документации.

1 голос
/ 22 октября 2011

Используйте встроенную функцию pipe, а не cmd.

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

...