Czy w Pythonie jest sposób na programowe określenie szerokości konsoli? Mam na myśli liczbę znaków, która mieści się w jednej linii bez zawijania, a nie szerokość okna w pikselach.
Edytować
Szukasz rozwiązania, które działa w systemie Linux
Czy w Pythonie jest sposób na programowe określenie szerokości konsoli? Mam na myśli liczbę znaków, która mieści się w jednej linii bez zawijania, a nie szerokość okna w pikselach.
Edytować
Szukasz rozwiązania, które działa w systemie Linux
Odpowiedzi:
używa komendy 'stty size', która zgodnie z wątkiem na liście mailingowej Pythona jest dość uniwersalna na Linuksie. Otwiera polecenie „rozmiar stty” jako plik, „odczytuje” z niego i wykorzystuje prosty podział łańcucha w celu oddzielenia współrzędnych.
W przeciwieństwie do wartości os.environ [„COLUMNS”] (do której nie mam dostępu pomimo używania bash jako mojej standardowej powłoki), dane również będą aktualne, podczas gdy uważam, że os.environ [„COLUMNS”] wartość będzie obowiązywać tylko w czasie uruchamiania interpretera python (załóżmy, że użytkownik zmienił rozmiar okna od tego czasu).
(Zobacz odpowiedź @GringoSuave na temat tego, jak to zrobić w Pythonie 3.3+)
źródło
rows, columns = subprocess.check_output(['stty', 'size']).split()
jest trochę krótszy, a podproces to przyszłośćrows, columns = subprocess.check_output(['stty', 'size']).decode().split()
Jeśli chcesz ciągów znaków Unicode dla kompatybilności py2 / 3Nie jestem pewien, dlaczego znajduje się w module
shutil
, ale wylądował tam w Pythonie 3.3, Sprawdzając rozmiar terminala wyjściowego :Implementacja niskiego poziomu znajduje się w module OS. Działa również w systemie Windows.
Backport jest teraz dostępny dla Python 3.2 i poniżej:
źródło
python3.5
zainstalowany hosting współdzielony WebFaction .Inappropriate ioctl for device
błędy / ostrzeżenia, albo otrzymałem zdefiniowaną wartość rezerwową 80.posługiwać się
EDYCJA : och, przepraszam. To nie jest standardowa wersja Pythona, oto źródło pliku console.py (nie wiem skąd).
Moduł wydaje się działać w ten sposób: sprawdza, czy
termcap
jest dostępny, kiedy tak. Wykorzystuje to; jeśli nie, sprawdza, czy terminal obsługuje specjalneioctl
wywołanie i to też nie działa, sprawdza zmienne środowiskowe, które eksportują niektóre powłoki. Prawdopodobnie będzie to działać tylko w systemie UNIX.źródło
Powyższy kod nie zwrócił poprawnego wyniku na moim systemie Linux, ponieważ winsize-struct ma 4 spodenki bez podpisu, a nie 2 spodenki z podpisem:
hp i hp powinny zawierać szerokość i wysokość pikseli, ale nie.
źródło
fcntl.ioctl(sys.stdin.fileno(), ...
stdout
lubstderr
zamiaststdin
tego.stdin
może równie dobrze być fajką. Możesz także dodać linię taką jakif not os.isatty(0): return float("inf")
.Rozejrzałem się i znalazłem rozwiązanie dla systemu Windows pod adresem:
http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/
i rozwiązanie dla systemu Linux tutaj.
Oto wersja, która działa zarówno na systemie Linux, OS X, jak i Windows / Cygwin:
źródło
To albo:
Ta
shutil
funkcja jest po prostu owijana wokół,os
która wychwytuje błędy i ustawia rezerwę, jednak ma jedno ogromne zastrzeżenie - psuje się podczas orurowania! , co jest dość dużą sprawą.Aby uzyskać rozmiar terminala podczas instalacji rurowej, użyj
os.get_terminal_size(0)
zamiast tego.Pierwszy argument
0
to argument wskazujący, że zamiast domyślnego standardowego wyjścia należy użyć deskryptora pliku stdin. Chcemy użyć stdin, ponieważ stdout odłącza się podczas potoku, co w tym przypadku powoduje błąd.Próbowałem dowiedzieć się, kiedy warto użyć argumentu stdout zamiast argumentu stdin i nie mam pojęcia, dlaczego jest to ustawienie domyślne.
źródło
os.get_terminal_size()
został wprowadzony w Pythonie 3.3os.get_terminal_size(0)
spowoduje awarię, jeśli potokujesz do standardowego wejścia. Spróbuj:echo x | python3 -c 'import os; print(os.get_terminal_size(0))'
Począwszy od Python 3.3 jest to proste: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal
źródło
shutil.get_terminal_size() is the high-level function which should normally be used, os.get_terminal_size is the low-level implementation.
Wygląda na to, że istnieją pewne problemy z tym kodem, Johannes:
getTerminalSize
musiimport os
env
? wyglądaos.environ
.Ponadto, po co przełączać
lines
icols
przed powrotem? JeśliTIOCGWINSZ
istty
obaj powiedząlines
tocols
, mówię, zostaw to w ten sposób. Zdezorientowało mnie to przez dobre 10 minut, zanim zauważyłem niekonsekwencję.Sridhar, nie dostałem tego błędu, gdy przesyłałem dane wyjściowe. Jestem prawie pewien, że został złapany prawidłowo w try-wyjątkiem.
pascal,
"HHHH"
nie działa na moim komputerze, ale"hh"
działa. Miałem problem ze znalezieniem dokumentacji dla tej funkcji. Wygląda na to, że zależy od platformy.chochem, włączony.
Oto moja wersja:
źródło
env
i rzeczywiście wynika toenv = os.environ
z przyjętej odpowiedzi .Wiele implementacji języka Python 2 tutaj zawiedzie, jeśli podczas wywoływania tego skryptu nie będzie terminalu sterującego. Możesz sprawdzić sys.stdout.isatty (), aby ustalić, czy w rzeczywistości jest to terminal, ale to wykluczy kilka przypadków, więc uważam, że najbardziej pythonicznym sposobem ustalenia rozmiaru terminalu jest użycie wbudowanego pakietu curses.
źródło
Próbowałem stąd rozwiązania, które wzywa do
stty size
:Jednak dla mnie to nie powiodło się, ponieważ pracowałem nad skryptem, który oczekuje przekierowanego wejścia na standardowe wejście, i
stty
narzekałby, że „stdin nie jest terminalem” w tym przypadku.Byłem w stanie sprawić, aby działało w następujący sposób:
źródło
Spróbuj „błogosławieństw”
Szukałem tego samego. Jest bardzo łatwy w użyciu i oferuje narzędzia do kolorowania, stylizacji i pozycjonowania w terminalu. To, czego potrzebujesz, jest tak proste, jak:
Działa jak urok w Linuksie. (Nie jestem pewien co do MacOSX i Windows)
Pobierz i dokumentację tutaj
lub możesz zainstalować za pomocą pipa:
źródło
Odpowiedź @ reannual działa dobrze, ale jest z tym problem:
os.popen
jest teraz przestarzała .subprocess
Moduł powinien być stosowany zamiast, więc oto wersja użytkownika @ reannual kod, który używasubprocess
i jest bezpośrednio odpowiada na pytanie (podając szerokość kolumny bezpośrednio jakoint
:Testowane na OS X 10.9
źródło
Jeśli używasz Pythona w wersji 3.3 lub nowszej, polecam wbudowaną wersję,
get_terminal_size()
jak już zalecono. Jeśli jednak utkniesz w starszej wersji i chcesz prostego, wieloplatformowego sposobu na zrobienie tego, możesz użyć asciimatics . Ten pakiet obsługuje wersje Pythona z powrotem do wersji 2.7 i korzysta z opcji podobnych do tych sugerowanych powyżej, aby uzyskać bieżący rozmiar terminala / konsoli.Wystarczy zbudować
Screen
klasę i użyćdimensions
właściwości, aby uzyskać wysokość i szerokość. Udowodniono, że działa to w systemach Linux, OSX i Windows.Aha - i pełne ujawnienie tutaj: jestem autorem, więc nie krępuj się otworzyć nowy problem, jeśli masz jakiekolwiek problemy z jego uruchomieniem.
źródło
Oto wersja, która powinna być kompatybilna z Linux i Solaris. Na podstawie postów i zamówień z madchine . Wymaga modułu podprocesu.
źródło