¿Hay alguna manera en Python para determinar mediante programación el ancho de la consola? Me refiero a la cantidad de caracteres que cabe en una línea sin ajuste, no al ancho de píxeles de la ventana.
Editar
Buscando una solución que funcione en Linux
Respuestas:
usa el comando 'stty size' que, según un hilo en la lista de correo de Python, es razonablemente universal en Linux. Abre el comando 'tamaño stty' como un archivo, 'lee' de él y usa una división de cadena simple para separar las coordenadas.
A diferencia del valor os.environ ["COLUMNS"] (al que no puedo acceder a pesar de usar bash como mi shell estándar), los datos también estarán actualizados, mientras que creo que os.environ ["COLUMNS"] El valor solo sería válido para el momento del lanzamiento del intérprete de Python (supongamos que el usuario ha cambiado el tamaño de la ventana desde entonces).
(Vea la respuesta de @GringoSuave sobre cómo hacer esto en Python 3.3+)
fuente
rows, columns = subprocess.check_output(['stty', 'size']).split()
es un poco más corto, más subproceso es el futurorows, columns = subprocess.check_output(['stty', 'size']).decode().split()
Si desea cadenas unicode para compatibilidad con py2 / 3No estoy seguro de por qué está en el módulo
shutil
, pero aterrizó allí en Python 3.3, consultando el tamaño del terminal de salida :Una implementación de bajo nivel está en el módulo os. También funciona en Windows.
Un backport ahora está disponible para Python 3.2 y siguientes:
fuente
python3.5
instalado.Inappropriate ioctl for device
errores / advertencias o el valor de recuperación definido de 80.utilizar
EDITAR : oh, lo siento. Esa no es una versión estándar de Python, aquí está la fuente de console.py (no sé de dónde es).
El módulo parece funcionar así: comprueba si
termcap
está disponible, en caso afirmativo. Utiliza eso; si no, verifica si el terminal admite unaioctl
llamada especial y eso tampoco funciona, verifica las variables de entorno que algunos shells exportan para eso. Esto probablemente funcionará solo en UNIX.fuente
El código anterior no devolvió el resultado correcto en mi Linux porque winsize-struct tiene 4 cortos sin firmar, no 2 cortos firmados:
HP y HP deben contener ancho y alto de píxeles, pero no lo hacen.
fuente
fcntl.ioctl(sys.stdin.fileno(), ...
stdout
o enstderr
lugar destdin
.stdin
bien podría ser una pipa. También es posible que desee agregar una línea comoif not os.isatty(0): return float("inf")
.Busqué y encontré una solución para Windows en:
http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/
y una solución para Linux aquí.
Así que aquí hay una versión que funciona tanto en Linux, OS X y Windows / Cygwin:
fuente
Es cualquiera:
La
shutil
función es solo una envoltura alrededor deos
una que detecta algunos errores y configura un respaldo, sin embargo, tiene una gran advertencia: ¡ se rompe al conectar tuberías! , que es un gran negocio.Para obtener el tamaño de la terminal al utilizar tuberías, en su
os.get_terminal_size(0)
lugar.El primer argumento
0
es un argumento que indica que se debe usar el descriptor de archivo stdin en lugar del stdout predeterminado. Queremos usar stdin porque stdout se separa cuando se canaliza, lo que en este caso genera un error.He intentado averiguar cuándo tendría sentido usar stdout en lugar de argumento stdin y no tengo idea de por qué es un valor predeterminado aquí.
fuente
os.get_terminal_size()
se introdujo en Python 3.3os.get_terminal_size(0)
se bloqueará si se canaliza a stdin. Prueba:echo x | python3 -c 'import os; print(os.get_terminal_size(0))'
Comenzando en Python 3.3 es sencillo: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal
fuente
shutil.get_terminal_size() is the high-level function which should normally be used, os.get_terminal_size is the low-level implementation.
Parece que hay algunos problemas con ese código, Johannes:
getTerminalSize
necesitaimport os
env
? Aspecto del productoos.environ
.Además, ¿por qué cambiar
lines
ycols
antes de regresar? SiTIOCGWINSZ
ystty
ambos dicenlines
entoncescols
, yo digo que lo dejes así. Esto me confundió durante unos 10 minutos antes de notar la inconsistencia.Sridhar, no recibí ese error cuando canalicé la salida. Estoy bastante seguro de que está siendo atrapado correctamente en el try-except.
pascal,
"HHHH"
no funciona en mi máquina, pero"hh"
sí. Tuve problemas para encontrar documentación para esa función. Parece que depende de la plataforma.chochem, incorporado.
Aquí está mi versión:
fuente
env
también, y de hechoenv = os.environ
, es por respuesta aceptada .Muchas de las implementaciones de Python 2 fallarán aquí si no hay un terminal de control cuando se llama a este script. Puede verificar sys.stdout.isatty () para determinar si esto es realmente un terminal, pero eso excluirá un montón de casos, por lo que creo que la forma más pitónica de averiguar el tamaño del terminal es usar el paquete de maldiciones incorporado.
fuente
Estaba probando la solución desde aquí que dice
stty size
:Sin embargo, esto falló para mí porque estaba trabajando en un script que espera una entrada redirigida en stdin, y me
stty
quejaría de que "stdin no es una terminal" en ese caso.Pude hacer que funcione así:
fuente
Prueba las "bendiciones"
Estaba buscando lo mismo. Es muy fácil de usar y ofrece herramientas para colorear, peinar y posicionar en el terminal. Lo que necesitas es tan fácil como:
Funciona como un encanto en Linux. (No estoy seguro acerca de MacOSX y Windows)
Descarga y documentación aquí
o puedes instalarlo con pip:
fuente
La respuesta de @ reannual funciona bien, pero hay un problema:
os.popen
ahora está en desuso . Elsubprocess
módulo debe usarse en su lugar, así que aquí hay una versión del código de @ reannual que usasubprocess
y responde directamente a la pregunta (dando el ancho de columna directamente comoint
:Probado en OS X 10.9
fuente
Si está utilizando Python 3.3 o superior, recomendaría el incorporado
get_terminal_size()
como ya se recomienda. Sin embargo, si está atascado con una versión anterior y desea una forma simple y multiplataforma de hacerlo, puede usar asciimáticos . Este paquete admite versiones de Python a 2.7 y utiliza opciones similares a las sugeridas anteriormente para obtener el tamaño actual de terminal / consola.Simplemente construya su
Screen
clase y use ladimensions
propiedad para obtener el alto y el ancho. Se ha demostrado que esto funciona en Linux, OSX y Windows.Ah, y divulgación completa aquí: soy el autor, así que siéntase libre de abrir un nuevo problema si tiene algún problema para que esto funcione.
fuente
Aquí hay una versión que debería ser compatible con Linux y Solaris. Basado en los mensajes y comentarios de madchine . Requiere el módulo de subproceso.
fuente