On Jan 15, 10:07 am, "Hendrik van Rooyen" <[EMAIL PROTECTED]> wrote: > I thought I would share this nasty little gotcha with the group. > > Consider the following code fragment: > > <start> > print 'starting kbd thread' > keyboard_thread = thread.start_new_thread(kbd_driver (port_q,kbd_q)) > print 'starting main loop' > error = Mainloop(s,port_q,active_q_list) > <end> > > It produces, as output, the following: > > starting kbd thread > we get here - a > > It does not print 'starting main loop', the Mainloop routine > is never executed, and no exceptions are raised. > > Here is the offending routine that seems to capture the control: > > <start> > def kbd_driver(out_q,in_q): > """ > thread to look for keyboard input and to put it on the queue out_q > also looks for replies on in_q and prints them > """ > > kbdname = '/dev/stdin' > > kbd = open(kbdname,'r+',1) # Reading, line buffered > > unblock(kbd) # Call the magic to unblock keyboard > print 'we get here - a' > while True: > > try: > d = kbd.readline() # see if any kbd input > except: > IOError > try: > msg=in_q.get(block=False) > except Queue.Empty: > time.sleep(0.1) > continue > print msg > time.sleep(0.1) > continue > d = d.rstrip() # get rid of line feed > out_q.put([d + '\r',in_q]) # add a carriage return and return q and > send > to port > <end> > > The unblock is a routine that unblocks a port using fcntl - it > is not the problem. In case you don't believe me, here it is: > > def unblock(f): > """Given file 'f', sets its unblock flag to true.""" > > fcntl.fcntl(f.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) > > I will post the solution tomorrow when I read my mail, > if no one has spotted it by then. > > - Hendrik
>>> keyboard_thread = thread.start_new_thread(kbd_driver (port_q,kbd_q)) Needs to be >>> keyboard_thread = thread.start_new_thread(kbd_driver, (port_q,kbd_q)) Commas are important! -Dan -- http://mail.python.org/mailman/listinfo/python-list