¿Cómo hacer un script de python “pipeable” en bash?

Escribí un guión y quiero que sea pipeable en bash. Algo como:

echo "1stArg" | myscript.py 

¿Es posible? ¿Cómo?

Mira este simple echo.py :

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

corriendo:

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

salida:

 echo.py test.py test.sh 

contenido debug_output.txt:

 DEBUG: got line: echo.py DEBUG: got line: test.py DEBUG: got line: test.sh 

Complementaré las otras respuestas con un ejemplo de grep que utiliza la entrada de archivo para implementar el comportamiento típico de las herramientas UNIX: 1) si no hay un archivo específico, lee los datos de stdin; 2) muchos archivos pueden ser enviados como argumentos; 3) - significa 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:])) 

Ejemplo:

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

En tu script de Python simplemente lees desde stdin .

Todo lo que se lee de stdin es “pipeable”. Pipe simplemente redirige la salida estándar del progtwig anterior al segundo.