Как сделать python script "pipeable" в bash?
Я написал script, и я хочу, чтобы он был доступен в bash. Что-то вроде:
echo "1stArg" | myscript.py
Возможно ли это? Как?
Ответы
Ответ 1
Смотрите этот простой 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
Ответ 2
Другие ответы уже указывали на sys.stdin
, я дополню их примером grep, который использует fileinput для реализации типичное поведение инструментов UNIX (если файлы не указаны, они читаются из stdin, многие файлы могут быть отправлены в качестве аргументов; -
означает stdin):
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
Ответ 3
В вашем Python script вы просто читаете с stdin
.
Ответ 4
Все, что читается из stdin, является "доступным". Труба просто перенаправляет stdout прежней программы на последнюю.