/pandas/util/terminal.py
https://github.com/hoffstein/pandas · Python · 120 lines · 81 code · 13 blank · 26 comment · 19 complexity · f1f957149241b734f39cbdefcec36bf5 MD5 · raw file
- """
- get_terminal_size() -- return width and height of terminal as a tuple
- code from:
- http://stackoverflow.com/questions/566746/how-to-get-console- window-width-in-
- python
- written by
- Harco Kuppens (http://stackoverflow.com/users/825214/harco-kuppens)
- It is mentioned in the stackoverflow response that this code works
- on linux, os x, windows and cygwin (windows).
- """
- from __future__ import print_function
- import os
- __all__ = ['get_terminal_size']
- def get_terminal_size():
- """
- Detect terminal size and return tuple = (width, height).
- Only to be used when running in a terminal. Note that the IPython notebook,
- IPython zmq frontends, or IDLE do not run in a terminal,
- """
- import platform
- 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 == 'Linux' or \
- current_os == 'Darwin' or \
- current_os.startswith('CYGWIN'):
- tuple_xy = _get_terminal_size_linux()
- if tuple_xy is None:
- tuple_xy = (80, 25) # default value
- return tuple_xy
- def _get_terminal_size_windows():
- res = None
- try:
- 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)
- except:
- return None
- if res:
- import struct
- (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
- else:
- return None
- def _get_terminal_size_tput():
- # get terminal width
- # src: http://stackoverflow.com/questions/263890/how-do-i-find-the-width
- # -height-of-a-terminal-window
- try:
- import subprocess
- proc = subprocess.Popen(["tput", "cols"],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
- output = proc.communicate(input=None)
- cols = int(output[0])
- proc = subprocess.Popen(["tput", "lines"],
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
- output = proc.communicate(input=None)
- rows = int(output[0])
- return (cols, rows)
- except:
- return None
- def _get_terminal_size_linux():
- def ioctl_GWINSZ(fd):
- try:
- import fcntl
- import termios
- import struct
- cr = struct.unpack(
- 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))
- except:
- return None
- return cr
- cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
- if not cr:
- try:
- fd = os.open(os.ctermid(), os.O_RDONLY)
- cr = ioctl_GWINSZ(fd)
- os.close(fd)
- except:
- pass
- if not cr or cr == (0, 0):
- try:
- from os import environ as env
- cr = (env['LINES'], env['COLUMNS'])
- except:
- return None
- return int(cr[1]), int(cr[0])
- if __name__ == "__main__":
- sizex, sizey = get_terminal_size()
- print('width = %s height = %s' % (sizex, sizey))