Best way of finding terminal width/height?
Joel Hedlund
joel.hedlund at gmail.com
Tue Feb 7 04:17:17 EST 2006
> You might want to try just setting a flag in the signal handler
> to see if that prevents the I/O operations on stdin/stdout from
> being interrupted.
Tried this:
<source>
import signal, os, sys
from terminal_info import get_terminal_size
terminal_size = get_terminal_size()
_bTerminalSizeChanged = False
def report_terminal_size_change(signum, frame):
global _bTerminalSizeChanged
_bTerminalSizeChanged = True
def update_terminal_size():
global _bTerminalSizeChanged, terminal_size
terminal_size = get_terminal_size()
_bTerminalSizeChanged = False
signal.signal(signal.SIGWINCH, report_terminal_size_change)
while True:
# Do lots of IO (I'm trying to provoke exceptions with signal)
open('/a/large/file').read()
#raw_input()
#sys.stdin.read()
#print open('/a/large/file').read()
if _bTerminalSizeChanged:
update_terminal_size()
print terminal_size
</source>
As before, the only IO case above that doesn't throw exceptions is the uncommented one.
> Yup, that's the exception. Standard practice is to catch it and
> retry the I/O operation.
Hmm... I guess it's not that easy to "retry" IO operations on pipes and streams (stdin/stdout in this case)... And I tend to lean pretty heavily on those since I usually write UNIX style text "filters".
So in case I haven't missed something fundamental I guess my best option is to accept defeat (of sorts :-) and be happy with picking a terminal width at program startup.
But anyway, it's been really interesting trying this out.
Thank you Grant (och Jorgen) for all help and tips!
/Joel
More information about the Python-list
mailing list