Existe-t-il un moyen en python de déterminer par programme la largeur de la console? Je veux dire le nombre de caractères qui tient sur une ligne sans habillage, pas la largeur en pixels de la fenêtre.
Éditer
Vous recherchez une solution qui fonctionne sous Linux
Réponses:
utilise la commande 'stty size' qui, selon un thread de la liste de diffusion python, est raisonnablement universelle sur linux. Il ouvre la commande «stty size» sous forme de fichier, «le lit» et utilise une simple chaîne de partage pour séparer les coordonnées.
Contrairement à la valeur os.environ ["COLUMNS"] (à laquelle je ne peux pas accéder malgré l'utilisation de bash comme shell standard), les données seront également à jour alors que je crois que os.environ ["COLUMNS"] La valeur ne serait valide que pour le lancement de l'interpréteur Python (supposons que l'utilisateur ait redimensionné la fenêtre depuis).
(Voir la réponse de @GringoSuave sur la façon de le faire sur python 3.3+)
la source
rows, columns = subprocess.check_output(['stty', 'size']).split()
est un peu plus court, et le sous-processus est l'avenirrows, columns = subprocess.check_output(['stty', 'size']).decode().split()
Si vous voulez des chaînes Unicode pour la compatibilité py2 / 3Je ne sais pas pourquoi il est dans le module
shutil
, mais il a atterri là-bas en Python 3.3, Interrogation de la taille du terminal de sortie :Une implémentation de bas niveau se trouve dans le module os. Fonctionne également sous Windows.
Un backport est désormais disponible pour Python 3.2 et versions antérieures:
la source
python3.5
installé.Inappropriate ioctl for device
utilisation
EDIT : oh, je suis désolé. Ce n'est pas une bibliothèque standard python, voici la source de console.py (je ne sais pas d'où il vient).
Le module semble fonctionner comme ça: il vérifie s'il
termcap
est disponible, quand oui. Il utilise cela; si non, il vérifie si le terminal prend en charge unioctl
appel spécial et cela ne fonctionne pas non plus, il vérifie les variables d'environnement que certains shells exportent pour cela. Cela ne fonctionnera probablement que sous UNIX.la source
Le code ci-dessus n'a pas retourné le résultat correct sur mon linux car winsize-struct a 4 shorts non signés, pas 2 shorts signés:
hp et hp doivent contenir la largeur et la hauteur des pixels, mais pas.
la source
fcntl.ioctl(sys.stdin.fileno(), ...
stdout
oustderr
au lieu destdin
, cependant.stdin
pourrait très bien être une pipe. Vous pouvez également ajouter une ligne telle queif not os.isatty(0): return float("inf")
.J'ai cherché et trouvé une solution pour Windows à:
http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/
et une solution pour linux ici.
Voici donc une version qui fonctionne à la fois sur linux, os x et windows / cygwin:
la source
C'est soit:
La
shutil
fonction est juste un wrapper autour deos
celui qui détecte certaines erreurs et configure une solution de repli, mais il a une énorme mise en garde - il se casse lors de la tuyauterie! , ce qui est assez énorme.Pour obtenir la taille du terminal lors de l'utilisation de la tuyauterie
os.get_terminal_size(0)
place.Premier argument
0
est un argument indiquant que le descripteur de fichier stdin doit être utilisé à la place de stdout par défaut. Nous voulons utiliser stdin car stdout se détache quand il est canalisé, ce qui dans ce cas soulève une erreur.J'ai essayé de comprendre à quel moment il serait judicieux d'utiliser stdout au lieu de l'argument stdin et je n'ai aucune idée pourquoi c'est un défaut ici.
la source
os.get_terminal_size()
a été introduit dans Python 3.3os.get_terminal_size(0)
plantera si vous dirigez vers stdin. Essayez:echo x | python3 -c 'import os; print(os.get_terminal_size(0))'
À partir de Python 3.3, c'est simple: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal
la source
shutil.get_terminal_size() is the high-level function which should normally be used, os.get_terminal_size is the low-level implementation.
Il semble qu'il y ait des problèmes avec ce code, Johannes:
getTerminalSize
a besoin deimport os
env
? ressembleos.environ
.Aussi, pourquoi changer
lines
etcols
avant de revenir? SiTIOCGWINSZ
et lesstty
deux disentlines
alorscols
, je dis de laisser les choses de cette façon. Cela m'a dérouté pendant 10 bonnes minutes avant de remarquer l'incohérence.Sridhar, je n'ai pas eu cette erreur lorsque j'ai canalisé la sortie. Je suis à peu près sûr qu'il est correctement pris dans l'essai, sauf.
pascal,
"HHHH"
ne fonctionne pas sur ma machine, mais"hh"
fonctionne. J'ai eu du mal à trouver de la documentation pour cette fonction. Il semble que cela dépend de la plate-forme.chochem, incorporé.
Voici ma version:
la source
env
, et c'est en effetenv = os.environ
de la réponse acceptée .De nombreuses implémentations Python 2 échoueront ici s'il n'y a pas de terminal de contrôle lorsque vous appelez ce script. Vous pouvez vérifier sys.stdout.isatty () pour déterminer s'il s'agit en fait d'un terminal, mais cela exclura un tas de cas, donc je pense que la façon la plus pythonique de déterminer la taille du terminal est d'utiliser le package curses intégré.
la source
J'essayais la solution d'ici qui appelle à
stty size
:Cependant, cela a échoué pour moi car je travaillais sur un script qui attend une entrée redirigée sur stdin, et
stty
je me plaindrais que "stdin n'est pas un terminal" dans ce cas.J'ai pu le faire fonctionner comme ceci:
la source
Essayez les "bénédictions"
Je cherchais exactement la même chose. Il est très simple d'utilisation et propose des outils de coloration, de mise en plis et de positionnement dans le terminal. Ce dont vous avez besoin est aussi simple que:
Fonctionne comme un charme sous Linux. (Je ne suis pas sûr de MacOSX et Windows)
Téléchargement et documentation ici
ou vous pouvez l'installer avec pip:
la source
La réponse de @ reannual fonctionne bien, mais elle a un problème: elle
os.popen
est désormais obsolète . Lesubprocess
module doit être utilisé à la place, alors voici une version du code de @ reannual qui utilisesubprocess
et répond directement à la question (en donnant directement la largeur de la colonne commeint
:Testé sur OS X 10.9
la source
Si vous utilisez Python 3.3 ou supérieur, je recommanderais le intégré
get_terminal_size()
comme déjà recommandé. Cependant, si vous êtes bloqué avec une version plus ancienne et que vous voulez un moyen simple et multiplateforme de le faire, vous pouvez utiliser des asciimatics . Ce package prend en charge les versions de Python de retour à 2.7 et utilise des options similaires à celles suggérées ci-dessus pour obtenir la taille actuelle du terminal / console.Construisez simplement votre
Screen
classe et utilisez ladimensions
propriété pour obtenir la hauteur et la largeur. Il a été prouvé que cela fonctionne sous Linux, OSX et Windows.Oh - et divulgation complète ici: je suis l'auteur, alors n'hésitez pas à ouvrir un nouveau problème si vous rencontrez des problèmes pour que cela fonctionne.
la source
Voici une version qui devrait être compatible Linux et Solaris. Basé sur les publications et les commentaires de madchine . Nécessite le module de sous-processus.
la source