Tengo algunos scripts de Python por ahí, y estoy trabajando en reescribirlos. Tengo el mismo problema con todos ellos.
No es obvio para mí cómo escribir los programas para que se comporten como herramientas Unix adecuadas.
Porque esto
$ cat characters | progname
y esto
$ progname characters
debería producir la misma salida.
Lo más parecido que pude encontrar a eso en Python fue la biblioteca de entrada de archivos. Desafortunadamente, realmente no veo cómo reescribir mis scripts de Python, todos los cuales se ven así:
#!/usr/bin/env python
# coding=UTF-8
import sys, re
for file in sys.argv[1:]:
f = open(file)
fs = f.read()
regexnl = re.compile('[^\s\w.,?!:;-]')
rstuff = regexnl.sub('', fs)
f.close()
print rstuff
La biblioteca de entrada de archivos procesa stdin si hay un stdin, y procesa un archivo si hay un archivo. Pero itera sobre líneas simples.
import fileinput
for line in fileinput.input():
process(line)
Realmente no entiendo eso. Supongo que si se trata de archivos pequeños, o si no está haciendo mucho a los archivos, esto puede parecer obvio. Pero, para mis propósitos, esto lo hace mucho más lento que simplemente abrir todo el archivo y leerlo en una cadena, como se indicó anteriormente.
Actualmente ejecuto el script anterior como
$ pythonscript textfilename1 > textfilename2
Pero quiero poder ejecutarlo (y sus hermanos) en tuberías, como
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2