Skip to content

Instantly share code, notes, and snippets.

Created July 26, 2011 21:58
Show Gist options
  • Save jtriley/1108174 to your computer and use it in GitHub Desktop.
Save jtriley/1108174 to your computer and use it in GitHub Desktop.
Get current terminal size on Linux, Mac, and Windows
#!/usr/bin/env python
import os
import shlex
import struct
import platform
import subprocess
def get_terminal_size():
""" getTerminalSize()
- get width and height of console
- works on linux,os x,windows,cygwin(windows)
originally retrieved from:
current_os = platform.system()
tuple_xy = None
if current_os == 'Windows':
tuple_xy = _get_terminal_size_windows()
if tuple_xy is None:
tuple_xy = _get_terminal_size_tput()
# needed for window's python in cygwin's xterm!
if current_os in ['Linux', 'Darwin'] or current_os.startswith('CYGWIN'):
tuple_xy = _get_terminal_size_linux()
if tuple_xy is None:
print "default"
tuple_xy = (80, 25) # default value
return tuple_xy
def _get_terminal_size_windows():
from ctypes import windll, create_string_buffer
# stdin handle is -10
# stdout handle is -11
# stderr handle is -12
h = windll.kernel32.GetStdHandle(-12)
csbi = create_string_buffer(22)
res = windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)
if res:
(bufx, bufy, curx, cury, wattr,
left, top, right, bottom,
maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
sizex = right - left + 1
sizey = bottom - top + 1
return sizex, sizey
def _get_terminal_size_tput():
# get terminal width
# src:
cols = int(subprocess.check_call(shlex.split('tput cols')))
rows = int(subprocess.check_call(shlex.split('tput lines')))
return (cols, rows)
def _get_terminal_size_linux():
def ioctl_GWINSZ(fd):
import fcntl
import termios
cr = struct.unpack('hh',
fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))
return cr
cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
if not cr:
fd =, os.O_RDONLY)
cr = ioctl_GWINSZ(fd)
if not cr:
cr = (os.environ['LINES'], os.environ['COLUMNS'])
return None
return int(cr[1]), int(cr[0])
if __name__ == "__main__":
sizex, sizey = get_terminal_size()
print 'width =', sizex, 'height =', sizey
Copy link

This works in Windows 8.. Thanks!

Copy link

prologic commented Dec 8, 2013

Thank you :) I'm using this for as part of it's tab completer function

Copy link

ghost commented Dec 11, 2013

I thought about using it for some stuff I'm writing it (thanks for providing it btw),
I forked it and added some 'caching' so it does not run all the tests again over and over:
It boosts it just a bit, 100k calls of the original get_terminal_size() took ~2.4 seconds, now it's just 1.8 seconds
(I'm not sure if that would be the pythonic way, I've just started learning python :'D)

Copy link

maxbane commented Mar 17, 2014

Nice. License?

Copy link

@maxbane I'm not sure how a license would work here, it was adapted from the script at which was adapted from

Copy link

Hi jtriley I want to thank you for this script. I do a minor changes to it and using it for my own downloader script which is in github. I want to ask if it's ok for you.

Here is the script.

Copy link

Great! I'll try to use this in my ffunenga/pipgh repo

Copy link

catb0t commented Feb 22, 2016

Sweet, I'll be using a rendition of this in

Copy link

For _get_terminal_size_tput, the subprocess calls should use subprocess.check_output, not subprocess.check_call.

The current code causes the size to be printed to the terminal, but the returned size will be (0,0) (that is, if tput successfully exits on each call).

Copy link

Thanks! Super helpful!

Copy link

Chronial commented Feb 3, 2018

Note that there is python standard lib function for this now: os.get_terminal_size()

Copy link

arvestad commented Oct 5, 2018

Thanks @Chronial for pointing this out! I note however that the docs for os.get_terminal_size() says that shutil.get_terminal_size() is the high-level call that should normally be used.

Copy link

kodekage commented Jun 30, 2020

What python version is supported?

I'm running the script with python3 and I'm getting syntax errors


Copy link

Copy link

If you want to get the terminal size on all OS now you just gotta do :

import os
width, height = os.get_terminal_size()

have a nice day 😃

Copy link

ola-sk commented Jul 21, 2022


If you want to get the terminal size on all OS now you just gotta do :

import os
width, height = os.get_terminal_size()

have a nice day 😃

Nope. Doesn't work on Windows 10 for me. The shutil.get_terminal_size() does work tough, just like @arvestad said

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment