web-dev-qa-db-ja.com

bashでpythonスクリプトを "パイプ可能"にする方法は?

スクリプトを作成し、bashでpipeableにしたい。何かのようなもの:

echo "1stArg" | myscript.py

出来ますか?どうやって?

50
gbr

このシンプルなecho.py

import sys

if __== "__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
67
khachik

他の回答を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 __== '__main__':
    sys.exit(main(sys.argv[1:]))

例:

$ seq 1 20 | python grep.py "4"
4
14
18
tokland

あなたのPythonスクリプトで単に stdinから読みます

11
NPE

Stdinから読み取るものはすべて「パイプ可能」です。パイプは、前者のプログラムの標準出力を後者に単純にリダイレクトします。

4
x13n