Estoy tratando de implementar algo similar a git log
, que solo mostrará la salida si el registro tiene una cierta longitud. Si usted no está familiarizado con git, estoy esencialmente tratando de lograr esto:Paging output from python
python some_script.py | less
Con la ayuda de la aplicación de paginación en python2.6/pydoc.py, yo era capaz de llegar con esto:
import os
text = '...some text...'
pipe = os.popen('less', 'w')
pipe.write(text)
pipe.close()
que funciona genial, pero os.popen() está en desuso. He considerado escribir en un archivo temporal y llamar menos con su ruta, pero eso no parece ideal. ¿Es esto posible con un subproceso? ¿Alguna otra idea?
EDIT:
Así que he recibido de trabajo subproceso. Yo era capaz de darle la variable de texto con Popen.communicate(text)
, pero ya que lo que realmente quiero redireccionar declaraciones de impresión, me he decidido por este:
import os, sys, subprocess, tempfile
page = True
if page:
path = tempfile.mkstemp()[1]
tmp_file = open(path, 'a')
sys.stdout = tmp_file
print '...some text...'
if page:
tmp_file.flush()
tmp_file.close()
p = subprocess.Popen(['less', path], stdin=subprocess.PIPE)
p.communicate()
sys.stdout = sys.__stdout__
Por supuesto, que terminaría siendo envolviéndolo en funciones. ¿Alguien ve un problema con eso?
Algunas observaciones: (1) el nombre del archivo temporal es único: el modo de apertura debe ser 'w', no 'a' (imposible de agregar al archivo). (2) No es necesario 'cerrar()' el archivo antes de leerlo. (3) No hay necesidad de comunicarse con el proceso de buscapersonas (basta con un simple 'subprocess.call()'). (4) Es más explícito no alterar un global como 'sys.stdout'; a menos que realmente necesite hacer esto (como si desea redirigir la salida de todos los submódulos que utiliza), es una buena idea llamar explícitamente una función de impresión especial. – EOL
Este es un tema similar con una respuesta agradable y concisa: http://stackoverflow.com/questions/37584717/how-to-write-python-script-with-man-page-like-out-put/ – user3019074