在python中是否有一种方法以编程方式确定控制台的宽度?我指的是一行中不换行的字符数,而不是窗口的像素宽度。

Edit

寻找在Linux上工作的解决方案


当前回答

它是:

import os
columns, rows = os.get_terminal_size(0)
# or
import shutil
columns, rows = shutil.get_terminal_size()

shutil函数只是一个os的包装器,它可以捕捉一些错误并设置一个回退,但是它有一个巨大的警告-当管道爆裂!这是一个相当大的交易。 使用os.get_terminal_size(0)来代替管道时获取终端大小。

第一个参数0是一个参数,指示应该使用stdin文件描述符而不是默认的stdout。我们希望使用stdin,因为stdout在被管道传输时会分离自身,在这种情况下会引发错误。

我试图弄清楚什么时候使用stdout而不是stdin参数是有意义的,不知道为什么它是这里的默认值。

其他回答

上面的代码在我的linux上没有返回正确的结果,因为winsize-struct有4个unsigned shorts,而不是2个signed shorts:

def terminal_size():
    import fcntl, termios, struct
    h, w, hp, wp = struct.unpack('HHHH',
        fcntl.ioctl(0, termios.TIOCGWINSZ,
        struct.pack('HHHH', 0, 0, 0, 0)))
    return w, h

HP和HP应该包含像素的宽度和高度,但不是。

如果您使用的是Python 3.3或更高版本,我建议使用内置的get_terminal_size()。但是,如果您使用的是旧版本,想要一种简单的、跨平台的方式,那么可以使用asciimatics。这个包支持2.7以下的Python版本,并使用与上面建议的选项类似的选项来获取当前终端/控制台大小。

简单地构造Screen类并使用dimensions属性获取高度和宽度。这已经在Linux、OSX和Windows上被证明是有效的。

哦,在这里完全披露:我是作者,所以如果你在这方面有任何问题,请随时打开一个新的问题。

从Python 3.3开始,它是直接的: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal

>>> import os
>>> ts = os.get_terminal_size()
>>> ts.lines
24
>>> ts.columns
80

不确定为什么它在模块shutil中,但它在Python 3.3中出现在那里。看到的:

查询输出终端的大小

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

底层实现在os模块中。跨平台工作在Linux, Mac OS和Windows,可能是其他unix类。还有一个后端口,虽然已经无关紧要了。

我正在尝试从这里调用stty大小的解决方案:

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

然而,这对我来说失败了,因为我正在编写一个脚本,期望在stdin上重定向输入,stty会抱怨“stdin不是终端”。

我能做到这样:

with open('/dev/tty') as tty:
    height, width = subprocess.check_output(['stty', 'size'], stdin=tty).split()