Quiero escribir un programa que lee la entrada estándar (sin búfer) y escribe la salida estándar (sin búfer) haciendo algunas triviales transformación char-por-char. Por el bien del ejemplo digamos que quiero eliminar todos los caracteres x
de stdin.¿Cómo escribo un filtro de Unix en Python?
Respuesta
No sé exactamente lo que quiere decir con buffer en este contexto, pero es muy simple de hacer lo que están pidiendo ...
so_gen.py (generando una corriente constante que podemos ver) :
import time
import sys
while True:
for char in 'abcdefx':
sys.stdout.write(char)
sys.stdout.flush()
time.sleep(0.1)
so_filter.py (haciendo lo que pide):
import sys
while True:
char = sys.stdin.read(1)
if not char:
break
if char != 'x':
sys.stdout.write(char)
sys.stdout.flush()
intente ejecutar python so_gen.py | python so_filter.py
para ver lo que hace.
Lea de sys.stdin
y escriba en sys.stdout
(o use print
). Su programa de ejemplo:
import sys
for line in sys.stdin:
print line.replace("x", ""),
No hay una forma estándar para hacer la entrada estándar sin búfer, y usted no quiere eso. Deje que el SO lo proteja.
Él dijo "unbuffered" pero no estoy seguro de que realmente importe. –
Edité mi respuesta como lo comentó. –
Puede utilizar el fileinput
class, que le permite procesar insumos como el operador de diamantes Perl haría. A partir de los documentos:
import fileinput
for line in fileinput.input():
process(line)
proceso en el que hace algo como print line.replace('x','')
.
Puede seguir this StackOverflow question de cómo retirar del búfer salida estándar. O simplemente puede llamar al sys.stdout.flush()
después de cada print
.
¡Ah! ¡Esto hace todo el trabajo extra que estaba haciendo porque extrañaba a Perl por nada! Necesito examinar muy de cerca la biblioteca estándar de Python. –
Utilice el interruptor -u para el intérprete de Python para hacer todas las lecturas y escrituras sin búfer. Similar al ajuste $| = true;
en Perl. Luego proceda como lo haría, leyendo una línea modificándola y luego imprimiéndola. sys.stdout.flush() no requerido.
#!/path/to/python -u
import sys
for line in sys.stdin:
process_line(line)
No funciona aquí ... –
- 1. ¿Cómo escribo un programa de filtro en C?
- 2. ¿Cómo escribo correctamente en FIFOs en Python?
- 3. ¿Cómo escribo una "pestaña" en Python?
- 4. Python - ¿Cómo escribo un decorador que restaura el cwd?
- 5. filtro de matriz en python?
- 6. ¿Cómo escribo un dialecto externo para SQLAlchemy?
- 7. ¿Cómo escribo datos binarios sin procesar en Python?
- 8. ¿Cómo escribo un temporizador en Objective-C?
- 9. ¿Cómo escribo en un OutputStream usando DefaultHttpClient?
- 10. ¿Cómo escribo un representante para PyYAML?
- 11. ¿Cómo escribo en un archivo oculto?
- 12. ¿Cómo escribo un breve literal en C++?
- 13. Python analógico de Unix 'que'
- 14. ¿Cómo escribo datos en un archivo csv en columnas y filas de una lista en python?
- 15. ¿Cómo escribo un complemento de Firefox?
- 16. ¿Cómo escribo un complemento de extensión de Photoshop (8BX)?
- 17. ¿Cómo redirigir en un filtro de servlet?
- 18. reproducir el comando cat Unix en Python
- 19. ¿Cómo puedo saber dónde se encuentra Python en Unix?
- 20. ¿Cómo escribo un cliente SSH simple?
- 21. ¿Cómo escribo un alias para grep -R?
- 22. ¿Cómo escribo un carácter de tabulación literal en Eclipse?
- 23. ¿Cómo escribo un método síncrono de bloqueo en Javascript?
- 24. ¿Cómo escribo un valor de color RGB en JavaScript?
- 25. ¿Cómo escribo un método de extensión en JavaScript?
- 26. ¿Cómo escribo en un archivo de texto usando AppleScript?
- 27. ¿Cómo escribo el nombre calificado de un símbolo en Haskell?
- 28. Cómo escribo un complemento de IE 8 en C =
- 29. ¿Cómo escribo esto en Ruby/Python? O bien, ¿puedes traducir mi LINQ a Ruby/Python?
- 30. ¿Cómo escribo un servidor HTTP python para escuchar en varios puertos?
ganador para escribir 'if not char: break' – flybywire
@flybywire: Su respuesta lo necesitaba, ninguna otra respuesta lo hizo ... –