How to get Linux console window width in Python

后端 未结 14 1129
清歌不尽
清歌不尽 2020-11-22 15:08

Is there a way in python to programmatically determine the width of the console? I mean the number of characters that fits in one line without wrapping, not the pixel width

相关标签:
14条回答
  • Try "blessings"

    I was looking for the very same thing. It is very easy to use and offers tools for coloring, styling and positioning in the terminal. What you need is as easy as:

    from blessings import Terminal
    
    t = Terminal()
    
    w = t.width
    h = t.height
    

    Works like a charm in Linux. (I'm not sure about MacOSX and Windows)

    Download and documentation here

    or you can install it with pip:

    pip install blessings
    
    0 讨论(0)
  • 2020-11-22 15:24

    I was trying the solution from here that calls out to stty size:

    columns = int(subprocess.check_output(['stty', 'size']).split()[1])
    

    However this failed for me because I was working on a script that expects redirected input on stdin, and stty would complain that "stdin isn't a terminal" in that case.

    I was able to make it work like this:

    with open('/dev/tty') as tty:
        height, width = subprocess.check_output(['stty', 'size'], stdin=tty).split()
    
    0 讨论(0)
  • 2020-11-22 15:26

    Not sure why it is in the module shutil, but it landed there in Python 3.3, Querying the size of the output terminal:

    >>> import shutil
    >>> shutil.get_terminal_size((80, 20))  # pass fallback
    os.terminal_size(columns=87, lines=23)  # returns a named-tuple
    

    A low-level implementation is in the os module. Also works in Windows.

    A backport is now available for Python 3.2 and below:

    • https://pypi.python.org/pypi/backports.shutil_get_terminal_size
    0 讨论(0)
  • 2020-11-22 15:27

    Here is an version that should be Linux and Solaris compatible. Based on the posts and commments from madchine. Requires the subprocess module.

    def termsize():
        import shlex, subprocess, re
        output = subprocess.check_output(shlex.split('/bin/stty -a'))
        m = re.search('rows\D+(?P\d+); columns\D+(?P\d+);', output)
        if m:
            return m.group('rows'), m.group('columns')
        raise OSError('Bad response: %s' % (output))
    
    >>> termsize()
    ('40', '100')
    
    0 讨论(0)
  • 2020-11-22 15:31

    @reannual's answer works well, but there's an issue with it: os.popen is now deprecated. The subprocess module should be used instead, so here's a version of @reannual's code that uses subprocess and directly answers the question (by giving the column width directly as an int:

    import subprocess
    
    columns = int(subprocess.check_output(['stty', 'size']).split()[1])
    

    Tested on OS X 10.9

    0 讨论(0)
  • 2020-11-22 15:32
    import os
    rows, columns = os.popen('stty size', 'r').read().split()
    

    uses the 'stty size' command which according to a thread on the python mailing list is reasonably universal on linux. It opens the 'stty size' command as a file, 'reads' from it, and uses a simple string split to separate the coordinates.

    Unlike the os.environ["COLUMNS"] value (which I can't access in spite of using bash as my standard shell) the data will also be up-to-date whereas I believe the os.environ["COLUMNS"] value would only be valid for the time of the launch of the python interpreter (suppose the user resized the window since then).

    (See answer by @GringoSuave on how to do this on python 3.3+)

    0 讨论(0)
提交回复
热议问题