I realised there was funny indentation mishap in my previus email. My mail prog indented the following line
signal.signal(signal.SIGWINCH, report_terminal_size_change) while in fact in IDLE it's unindented, which makes a lot more sense: signal.signal(signal.SIGWINCH, report_terminal_size_change) Sorry about that. /Joel Joel Hedlund wrote: >> 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 -- http://mail.python.org/mailman/listinfo/python-list