Comment faire un script python "pipeable" en bash?

j'ai écrit un script et je veux qu'il soit pipeable en bash. Quelque chose comme:

echo "1stArg" | myscript.py

est-ce possible? Comment?

44
demandé sur Anto 2010-12-13 17:45:37

4 réponses

voir ce simple echo.py :

import sys

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

en cours d'exécution:

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

sortie:

echo.py
test.py
test.sh

la sortie de débogage.txt contenu:

DEBUG: got line: echo.py
DEBUG: got line: test.py
DEBUG: got line: test.sh
60
répondu khachik 2010-12-13 20:51:47

D'autres réponses ont déjà pointé vers sys.stdin , je vais les compléter avec un grep exemple qui utilise fileinput pour mettre en œuvre le comportement typique des outils UNIX (si aucun fichier n'est spécifié, il lit à partir de stdin; de nombreux fichiers peuvent être envoyés comme arguments; - signifie 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:]))

exemple:

$ seq 1 20 | python grep.py "4"
4
14
16
répondu tokland 2017-11-16 11:40:13

dans votre script Python vous pouvez simplement lire stdin .

10
répondu NPE 2017-05-23 11:46:49

Tout ce que lit stdin est "pipeable". Pipe redirige simplement stdout du premier programme vers le second.

4
répondu x13n 2010-12-13 14:47:05