| """This is like pexpect, but will work on any file descriptor that you pass it. |
| So you are reponsible for opening and close the file descriptor. |
| |
| $Id: fdpexpect.py 505 2007-12-26 21:33:50Z noah $ |
| """ |
| |
| from pexpect import * |
| import os |
| |
| __all__ = ['fdspawn'] |
| |
| class fdspawn (spawn): |
| |
| """This is like pexpect.spawn but allows you to supply your own open file |
| descriptor. For example, you could use it to read through a file looking |
| for patterns, or to control a modem or serial device. """ |
| |
| def __init__ (self, fd, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None): |
| |
| """This takes a file descriptor (an int) or an object that support the |
| fileno() method (returning an int). All Python file-like objects |
| support fileno(). """ |
| |
| ### TODO: Add better handling of trying to use fdspawn in place of spawn |
| ### TODO: (overload to allow fdspawn to also handle commands as spawn does. |
| |
| if type(fd) != type(0) and hasattr(fd, 'fileno'): |
| fd = fd.fileno() |
| |
| if type(fd) != type(0): |
| raise ExceptionPexpect ('The fd argument is not an int. If this is a command string then maybe you want to use pexpect.spawn.') |
| |
| try: # make sure fd is a valid file descriptor |
| os.fstat(fd) |
| except OSError: |
| raise ExceptionPexpect, 'The fd argument is not a valid file descriptor.' |
| |
| self.args = None |
| self.command = None |
| spawn.__init__(self, None, args, timeout, maxread, searchwindowsize, logfile) |
| self.child_fd = fd |
| self.own_fd = False |
| self.closed = False |
| self.name = '<file descriptor %d>' % fd |
| |
| def __del__ (self): |
| |
| return |
| |
| def close (self): |
| |
| if self.child_fd == -1: |
| return |
| if self.own_fd: |
| self.close (self) |
| else: |
| self.flush() |
| os.close(self.child_fd) |
| self.child_fd = -1 |
| self.closed = True |
| |
| def isalive (self): |
| |
| """This checks if the file descriptor is still valid. If os.fstat() |
| does not raise an exception then we assume it is alive. """ |
| |
| if self.child_fd == -1: |
| return False |
| try: |
| os.fstat(self.child_fd) |
| return True |
| except: |
| return False |
| |
| def terminate (self, force=False): |
| |
| raise ExceptionPexpect ('This method is not valid for file descriptors.') |
| |
| def kill (self, sig): |
| |
| return |
| |