1"""This is like pexpect, but will work on any file descriptor that you pass it. 2So you are reponsible for opening and close the file descriptor. 3 4$Id: fdpexpect.py 505 2007-12-26 21:33:50Z noah $ 5""" 6 7from pexpect import * 8import os 9 10__all__ = ['fdspawn'] 11 12class fdspawn (spawn): 13 14 """This is like pexpect.spawn but allows you to supply your own open file 15 descriptor. For example, you could use it to read through a file looking 16 for patterns, or to control a modem or serial device. """ 17 18 def __init__ (self, fd, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None): 19 20 """This takes a file descriptor (an int) or an object that support the 21 fileno() method (returning an int). All Python file-like objects 22 support fileno(). """ 23 24 ### TODO: Add better handling of trying to use fdspawn in place of spawn 25 ### TODO: (overload to allow fdspawn to also handle commands as spawn does. 26 27 if type(fd) != type(0) and hasattr(fd, 'fileno'): 28 fd = fd.fileno() 29 30 if type(fd) != type(0): 31 raise ExceptionPexpect ('The fd argument is not an int. If this is a command string then maybe you want to use pexpect.spawn.') 32 33 try: # make sure fd is a valid file descriptor 34 os.fstat(fd) 35 except OSError: 36 raise ExceptionPexpect, 'The fd argument is not a valid file descriptor.' 37 38 self.args = None 39 self.command = None 40 spawn.__init__(self, None, args, timeout, maxread, searchwindowsize, logfile) 41 self.child_fd = fd 42 self.own_fd = False 43 self.closed = False 44 self.name = '<file descriptor %d>' % fd 45 46 def __del__ (self): 47 48 return 49 50 def close (self): 51 52 if self.child_fd == -1: 53 return 54 if self.own_fd: 55 self.close (self) 56 else: 57 self.flush() 58 os.close(self.child_fd) 59 self.child_fd = -1 60 self.closed = True 61 62 def isalive (self): 63 64 """This checks if the file descriptor is still valid. If os.fstat() 65 does not raise an exception then we assume it is alive. """ 66 67 if self.child_fd == -1: 68 return False 69 try: 70 os.fstat(self.child_fd) 71 return True 72 except: 73 return False 74 75 def terminate (self, force=False): 76 77 raise ExceptionPexpect ('This method is not valid for file descriptors.') 78 79 def kill (self, sig): 80 81 return 82 83