1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- """This is like pexpect, but will work on any file descriptor that you pass it.
- You are reponsible for opening and close the file descriptor.
- PEXPECT LICENSE
- This license is approved by the OSI and FSF as GPL-compatible.
- http://opensource.org/licenses/isc-license.txt
- Copyright (c) 2012, Noah Spurrier <noah@noah.org>
- PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE FOR ANY
- PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT THE ABOVE
- COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- """
- 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
|