Gibt es in Python eine Möglichkeit, die Breite der Konsole programmgesteuert zu bestimmen? Ich meine die Anzahl der Zeichen, die in eine Zeile ohne Umbruch passen, nicht die Pixelbreite des Fensters.
Bearbeiten
Auf der Suche nach einer Lösung, die unter Linux funktioniert
Antworten:
verwendet den Befehl 'stty size', der laut einem Thread auf der Python-Mailingliste unter Linux einigermaßen universell ist. Es öffnet den Befehl 'stty size' als Datei, 'liest' daraus und verwendet eine einfache Zeichenfolgenaufteilung, um die Koordinaten zu trennen.
Im Gegensatz zum Wert von os.environ ["COLUMNS"] (auf den ich trotz Verwendung von bash als Standard-Shell nicht zugreifen kann) sind die Daten auch aktuell, während ich glaube, dass der Wert von os.environ ["COLUMNS"] Der Wert ist nur für den Zeitpunkt des Starts des Python-Interpreters gültig (vorausgesetzt, der Benutzer hat die Größe des Fensters seitdem geändert).
(Siehe Antwort von @GringoSuave, wie dies unter Python 3.3+ funktioniert.)
quelle
rows, columns = subprocess.check_output(['stty', 'size']).split()
ist etwas kürzer, und Teilprozess ist die Zukunftrows, columns = subprocess.check_output(['stty', 'size']).decode().split()
Wenn Sie Unicode-Zeichenfolgen für py2 / 3-Kompatibilität wünschenIch bin mir nicht sicher, warum es sich im Modul befindet
shutil
, aber es ist dort in Python 3.3 gelandet. Abfragen der Größe des Ausgabeterminals :Eine Implementierung auf niedriger Ebene befindet sich im OS-Modul. Funktioniert auch unter Windows.
Für Python 3.2 und niedriger ist jetzt ein Backport verfügbar:
quelle
python3.5
installiert.Inappropriate ioctl for device
Fehler / Warnungen oder den definierten Fallback-Wert von 80.verwenden
EDIT : Oh, tut mir leid. Das ist keine Python-Standardbibliothek, hier ist die Quelle von console.py (ich weiß nicht, woher es kommt).
Das Modul scheint so zu funktionieren: Es prüft, ob
termcap
es verfügbar ist, wenn ja. Es benutzt das; Wenn nein, wird geprüft, ob das Terminal einen speziellenioctl
Aufruf unterstützt, und dies funktioniert auch nicht. Es wird nach Umgebungsvariablen gesucht, die einige Shells dafür exportieren. Dies funktioniert wahrscheinlich nur unter UNIX.quelle
Der obige Code hat unter Linux kein korrektes Ergebnis zurückgegeben, da wonize-struct 4 nicht signierte Shorts und nicht 2 signierte Shorts enthält:
HP und HP sollten Pixelbreite und -höhe enthalten, aber nicht.
quelle
fcntl.ioctl(sys.stdin.fileno(), ...
stdout
oderstderr
stattdessenstdin
.stdin
könnte sehr gut eine Pfeife sein. Möglicherweise möchten Sie auch eine Zeile hinzufügen, zif not os.isatty(0): return float("inf")
.Ich suchte herum und fand eine Lösung für Windows unter:
http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/
und eine Lösung für Linux hier.
Hier ist eine Version, die sowohl unter Linux, OS X als auch unter Windows / Cygwin funktioniert:
quelle
Es ist entweder:
Die
shutil
Funktion ist nur ein Wrapper umos
einen, der einige Fehler abfängt und einen Fallback einrichtet. Sie hat jedoch eine große Einschränkung: Sie bricht beim Piping! , das ist eine ziemlich große Sache.Verwenden Sie
os.get_terminal_size(0)
stattdessen die Anschlussgröße für Rohrleitungen .Das erste Argument
0
ist ein Argument, das angibt, dass der Stdin-Dateideskriptor anstelle des Standard-Stdout verwendet werden sollte. Wir möchten stdin verwenden, da sich stdout beim Piping von selbst löst, was in diesem Fall einen Fehler auslöst.Ich habe versucht herauszufinden, wann es sinnvoll wäre, stdout anstelle von stdin zu verwenden, und habe keine Ahnung, warum dies hier eine Standardeinstellung ist.
quelle
os.get_terminal_size()
wurde in Python 3.3os.get_terminal_size(0)
wird abstürzen, wenn Sie zu stdin leiten. Versuchen Sie:echo x | python3 -c 'import os; print(os.get_terminal_size(0))'
Ab Python 3.3 ist es ganz einfach: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal
quelle
shutil.get_terminal_size() is the high-level function which should normally be used, os.get_terminal_size is the low-level implementation.
Es sieht so aus, als gäbe es einige Probleme mit diesem Code, Johannes:
getTerminalSize
mussimport os
env
? sieht aus wieos.environ
.Warum auch wechseln
lines
undcols
vor der Rückkehr? WennTIOCGWINSZ
undstty
beidelines
dann sagencols
, sage ich, lass es so. Dies verwirrte mich gut 10 Minuten lang, bevor ich die Inkonsistenz bemerkte.Sridhar, ich habe diesen Fehler nicht erhalten, als ich die Ausgabe weitergeleitet habe. Ich bin mir ziemlich sicher, dass es beim Versuch richtig erwischt wird - außer.
Pascal,
"HHHH"
funktioniert nicht auf meiner Maschine, aber"hh"
funktioniert. Ich hatte Probleme, Dokumentation für diese Funktion zu finden. Es sieht so aus, als wäre es plattformabhängig.Chochem, eingearbeitet.
Hier ist meine Version:
quelle
env
, und es ist in der Tatenv = os.environ
von der akzeptierten Antwort .Viele der hier beschriebenen Python 2-Implementierungen schlagen fehl, wenn beim Aufrufen dieses Skripts kein steuerndes Terminal vorhanden ist. Sie können sys.stdout.isatty () überprüfen, um festzustellen, ob es sich tatsächlich um ein Terminal handelt. Dies schließt jedoch eine Reihe von Fällen aus. Daher glaube ich, dass die Verwendung des integrierten Curses-Pakets die pythonischste Methode zum Ermitteln der Terminalgröße ist.
quelle
Ich habe von hier aus die Lösung ausprobiert, die Folgendes fordert
stty size
:Dies schlug jedoch für mich fehl, weil ich an einem Skript arbeitete, das umgeleitete Eingaben auf stdin erwartet, und mich
stty
beschweren würde, dass "stdin in diesem Fall kein Terminal ist".Ich konnte es so machen:
quelle
Die Antwort von @ reannual funktioniert gut, aber es gibt ein Problem: Sie
os.popen
ist jetzt veraltet . Dassubprocess
Modul sollte stattdessen verwendet werden. Hier ist eine Version des Codes von @ reannual, diesubprocess
die Frage verwendet und direkt beantwortet (indem die Spaltenbreite direkt angegeben wird alsint
:Getestet unter OS X 10.9
quelle
Versuchen Sie "Segen"
Ich suchte genau das Gleiche. Es ist sehr einfach zu bedienen und bietet Werkzeuge zum Färben, Stylen und Positionieren im Terminal. Was Sie brauchen, ist so einfach wie:
Funktioniert wie ein Zauber unter Linux. (Ich bin mir bei MacOSX und Windows nicht sicher)
Download und Dokumentation hier
oder Sie können es mit pip installieren:
quelle
Wenn Sie Python 3.3 oder höher verwenden, würde ich das
get_terminal_size()
bereits empfohlene integrierte Gerät empfehlen. Wenn Sie jedoch mit einer älteren Version nicht weiterkommen und eine einfache, plattformübergreifende Methode suchen , können Sie Asciimatics verwenden . Dieses Paket unterstützt Versionen von Python bis 2.7 und verwendet ähnliche Optionen wie die oben vorgeschlagenen, um die aktuelle Terminal- / Konsolengröße zu ermitteln.Konstruieren Sie einfach Ihre
Screen
Klasse und verwenden Sie diedimensions
Eigenschaft, um die Höhe und Breite zu ermitteln. Dies funktioniert nachweislich unter Linux, OSX und Windows.Oh - und vollständige Offenlegung hier: Ich bin der Autor. Sie können also gerne eine neue Ausgabe eröffnen, wenn Sie Probleme haben, diese zum Laufen zu bringen.
quelle
Hier ist eine Version, die Linux- und Solaris-kompatibel sein sollte. Basierend auf den Beiträgen und Kommentaren von madchine . Benötigt das Unterprozessmodul.
quelle