如何在Python中获取Linux控制台窗口宽度

326

在Python中有没有一种方法可以自动确定控制台的宽度?我的意思是指不换行情况下适合一行的字符数,而不是窗口的像素宽度。

编辑

寻找适用于Linux的解决方案。


请查看此答案以获得更全面的解决方案,以实现“列依赖”打印机制。 https://stackoverflow.com/questions/44129613/how-to-print-number-of-characters-based-on-terminal-width-that-also-resize/44133299#44133299 - Riccardo Petraglia
2
请考虑更改已接受的答案。您选择的那个答案非常不稳定,依赖于平台,并且正在使用已弃用的 os.popen。得票最高的答案展示了使用 shutil 的最佳方法。 - wim
15个回答

1

我正在尝试这里的解决方案,它调用stty size

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()

1
如果您使用的是Python 3.3或更高版本,我建议使用内置的get_terminal_size(),如先前所建议的。但是,如果您被困在旧版本中并且想要一种简单的跨平台方法来完成此操作,您可以使用asciimatics。该软件包支持Python 2.7及更高版本,并使用与上述建议类似的选项来获取当前终端/控制台大小。
只需构造您的Screen类并使用dimensions属性以获取高度和宽度即可。这已被证明适用于Linux、OSX和Windows。
哦,还有一个完整的披露:我是作者,如果您在使用过程中遇到任何问题,请随时提出新问题。

size = os.get_terminal_size() -> OSError: [Errno 25] Inappropriate ioctl for device - Rui Martins
@RuiMartins 请在 Github 上提出问题(并附上系统的详细信息),我会查看。 - Peter Brittain

1

使用subprocess,这是最方便的方法:

导入:

import subprocess

使用示例:

print(subprocess.check_output(['stty', 'size']).split())

注意:此函数返回字节,但您可以使用int()函数将其转换为整数。
注意:此函数返回一个数组,其中:array [0]=array [1]=
[b'46', b'188']

例如,如果您需要比较控制台的宽度是否大于W,您可以这样做:
if int(subprocess.check_output(['stty', 'size']).split()[1]) > W:
    ...


0

@reannual的回答很好,但它存在一个问题:os.popen现在已经被弃用。应该使用subprocess模块,因此这里是@reannual代码的一个版本,它使用subprocess并直接回答问题(通过将列宽直接作为int给出):

import subprocess

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

已在 OS X 10.9 上测试


-1

这是一个Linux和Solaris兼容的版本。基于madchine的帖子和评论。需要subprocess模块。

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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接