Existe uma maneira em python para determinar programaticamente a largura do console? Quero dizer o número de caracteres que cabe em uma linha sem quebra automática, não a largura de pixel da janela.
Editar
Procurando uma solução que funcione no Linux
Respostas:
usa o comando 'stty size' que de acordo com um thread na lista de discussão python é razoavelmente universal no linux. Ele abre o comando 'stty size' como um arquivo, 'lê' a partir dele e usa uma divisão simples de string para separar as coordenadas.
Diferente do valor os.environ ["COLUMNS"] (que não consigo acessar, apesar de usar o bash como meu shell padrão), os dados também estarão atualizados, enquanto acredito que o os.environ ["COLUMNS"] O valor seria válido apenas durante o lançamento do interpretador python (suponha que o usuário redimensione a janela desde então).
(Veja a resposta de @GringoSuave sobre como fazer isso no python 3.3+)
fonte
rows, columns = subprocess.check_output(['stty', 'size']).split()
é um pouco mais curto, mais subprocesso é o futurorows, columns = subprocess.check_output(['stty', 'size']).decode().split()
Se você quiser strings unicode para compatibilidade PY2 / 3Não sei por que ele está no módulo
shutil
, mas foi parar no Python 3.3, Consultando o tamanho do terminal de saída :Uma implementação de baixo nível está no módulo os. Também funciona no Windows.
Um backport está agora disponível para Python 3.2 e abaixo:
fonte
python3.5
instalada.Inappropriate ioctl for device
erros / avisos, ou se o valor fallback definido de 80.usar
EDIT : oh, me desculpe. Essa não é uma lib padrão do python, aqui está a fonte do console.py (não sei de onde é).
O módulo parece funcionar assim: verifica se
termcap
está disponível, quando sim. Ele usa isso; caso contrário, verifica se o terminal suporta umaioctl
chamada especial e também não funciona, verifica as variáveis de ambiente que alguns shells exportam para isso. Provavelmente isso funcionará apenas no UNIX.fonte
O código acima não retornou o resultado correto no meu linux porque o winsize-struct possui 4 shorts não assinados, não 2 shorts assinados:
hp e hp devem conter largura e altura de pixel, mas não.
fonte
fcntl.ioctl(sys.stdin.fileno(), ...
stdout
ou emstderr
vez destdin
, no entanto.stdin
pode muito bem ser um cano. Você também pode adicionar uma linha comoif not os.isatty(0): return float("inf")
.Eu procurei e encontrei uma solução para o Windows em:
http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/
e uma solução para linux aqui.
Então, aqui está uma versão que funciona tanto em linux, os x quanto windows / cygwin:
fonte
Também é:
A
shutil
função é apenas um invólucro em torno deos
um que detecta alguns erros e configura um fallback, no entanto, possui uma grande ressalva - ela quebra ao canalizar! , o que é um grande negócio.Para obter o tamanho do terminal ao usar a tubulação
os.get_terminal_size(0)
.Primeiro argumento
0
é um argumento indicando que o descritor de arquivo stdin deve ser usado em vez do stdout padrão. Queremos usar o stdin porque o stdout se desconecta quando está sendo canalizado, o que nesse caso gera um erro.Eu tentei descobrir quando faria sentido usar o argumento stdout em vez do argumento stdin e não faço idéia do por que é um padrão aqui.
fonte
os.get_terminal_size()
foi introduzido no Python 3.3os.get_terminal_size(0)
falhará se você usar o stdin. Tente:echo x | python3 -c 'import os; print(os.get_terminal_size(0))'
A partir do Python 3.3, é simples: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal
fonte
shutil.get_terminal_size() is the high-level function which should normally be used, os.get_terminal_size is the low-level implementation.
Parece que há alguns problemas com esse código, Johannes:
getTerminalSize
precisa deimport os
env
? pareceos.environ
.Além disso, por que mudar
lines
ecols
antes de retornar? SeTIOCGWINSZ
e osstty
dois dizemlines
entãocols
, digo assim. Isso me confundiu por uns bons 10 minutos antes de eu notar a inconsistência.Sridhar, não recebi esse erro quando canalizei a saída. Tenho certeza de que está sendo capturado corretamente na tentativa, exceto.
pascal,
"HHHH"
não funciona na minha máquina, mas"hh"
funciona. Eu tive problemas para encontrar documentação para essa função. Parece que depende da plataforma.chochem, incorporado.
Aqui está a minha versão:
fonte
env
também, e é de factoenv = os.environ
, de resposta aceita .Muitas das implementações do Python 2 aqui falharão se não houver um terminal de controle quando você chamar esse script. Você pode verificar sys.stdout.isatty () para determinar se esse é realmente um terminal, mas isso excluirá muitos casos, portanto, acredito que a maneira mais pitônica de descobrir o tamanho do terminal é usar o pacote de maldições embutido.
fonte
Eu estava tentando a solução daqui que chama
stty size
:No entanto, isso falhou para mim porque eu estava trabalhando em um script que espera uma entrada redirecionada no stdin e
stty
queixaria-me de que "stdin não é um terminal" nesse caso.Consegui fazê-lo funcionar assim:
fonte
Tente "bênçãos"
Eu estava procurando a mesma coisa. É muito fácil de usar e oferece ferramentas para colorir, modelar e posicionar no terminal. O que você precisa é tão fácil quanto:
Funciona como um encanto no Linux. (Não tenho certeza sobre o MacOSX e o Windows)
Download e documentação aqui
ou você pode instalá-lo com o pip:
fonte
A resposta do @ reannual funciona bem, mas há um problema:
os.popen
agora está obsoleto . Osubprocess
módulo deve ser usado, então aqui está uma versão do código do @ reannual que usasubprocess
e responde diretamente à pergunta (fornecendo a largura da coluna diretamente comoint
:Testado no OS X 10.9
fonte
Se você estiver usando o Python 3.3 ou superior, recomendo o built-in
get_terminal_size()
como já recomendado. No entanto, se você está preso a uma versão mais antiga e deseja uma maneira simples e multiplataforma de fazer isso, pode usar asciimatics . Este pacote suporta versões do Python de volta para 2.7 e usa opções semelhantes às sugeridas acima para obter o tamanho atual do terminal / console.Simplesmente construa sua
Screen
classe e use adimensions
propriedade para obter a altura e a largura. Está provado que funciona no Linux, OSX e Windows.Ah - e divulgação completa aqui: eu sou o autor, por isso, sinta-se à vontade para abrir uma nova edição, se você tiver algum problema para fazer isso funcionar.
fonte
Aqui está uma versão que deve ser compatível com Linux e Solaris. Baseado nos posts e comentários de madchine . Requer o módulo de subprocesso.
fonte