Как сделать Python-скрипт "pipeable" в Bash? - PullRequest
49 голосов
/ 13 декабря 2010

Я написал скрипт и хочу, чтобы он был pipeable в bash. Что-то вроде:

echo "1stArg" | myscript.py

Возможно ли это? Как?

Ответы [ 4 ]

66 голосов
/ 13 декабря 2010

См. Это просто echo.py:

import sys

if __name__ == "__main__":
    for line in sys.stdin:
        sys.stderr.write("DEBUG: got line: " + line)
        sys.stdout.write(line)

работает:

ls | python echo.py 2>debug_output.txt | sort

вывод:

echo.py
test.py
test.sh

debug_output.txt содержимое:

DEBUG: got line: echo.py
DEBUG: got line: test.py
DEBUG: got line: test.sh
18 голосов
/ 13 декабря 2010

Я дополню другие ответы примером grep , который использует fileinput для реализации типичного поведения инструментов UNIX: 1) если файл не указан, он считывает данные из STDIN; 2) многие файлы могут быть отправлены в качестве аргументов; 3) - означает стандартный ввод.

import fileinput
import re
import sys

def grep(lines, regexp):
    return (line for line in lines if regexp.search(line))

def main(args):
    if len(args) < 1:
        print("Usage: grep.py PATTERN [FILE...]", file=sys.stderr)
        return 2 
    regexp = re.compile(args[0])
    input_lines = fileinput.input(args[1:])
    for output_line in grep(input_lines, regexp):
        sys.stdout.write(output_line)

if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

Пример:

$ seq 1 20 | python grep.py "4"
4
14
11 голосов
/ 13 декабря 2010

В вашем скрипте Python вы просто читаете из stdin.

4 голосов
/ 13 декабря 2010

Все, что читает из stdin, "pipeable".Pipe просто перенаправляет стандартный вывод первой программы на последнюю.

...