X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=eventlet%2Feventlet%2Fgreen%2Fsubprocess.py;fp=eventlet%2Feventlet%2Fgreen%2Fsubprocess.py;h=0000000000000000000000000000000000000000;hb=358bd9258c2b6d2ee74de4dfd07a5123107abad4;hp=1d7c49a3b2ebcb6d24df2c66d0fab69e909a650f;hpb=376ff3bfe7071cc0793184a378c4e74508fb0d97;p=packages%2Ftrusty%2Fpython-eventlet.git diff --git a/eventlet/eventlet/green/subprocess.py b/eventlet/eventlet/green/subprocess.py deleted file mode 100644 index 1d7c49a..0000000 --- a/eventlet/eventlet/green/subprocess.py +++ /dev/null @@ -1,102 +0,0 @@ -import errno -import time -from types import FunctionType - -import eventlet -from eventlet import greenio -from eventlet import patcher -from eventlet.green import select -from eventlet.support import six - - -patcher.inject('subprocess', globals(), ('select', select)) -subprocess_orig = __import__("subprocess") - - -if getattr(subprocess_orig, 'TimeoutExpired', None) is None: - # Backported from Python 3.3. - # https://bitbucket.org/eventlet/eventlet/issue/89 - class TimeoutExpired(Exception): - """This exception is raised when the timeout expires while waiting for - a child process. - """ - - def __init__(self, cmd, timeout, output=None): - self.cmd = cmd - self.timeout = timeout - self.output = output - - def __str__(self): - return ("Command '%s' timed out after %s seconds" % - (self.cmd, self.timeout)) - - -# This is the meat of this module, the green version of Popen. -class Popen(subprocess_orig.Popen): - """eventlet-friendly version of subprocess.Popen""" - # We do not believe that Windows pipes support non-blocking I/O. At least, - # the Python file objects stored on our base-class object have no - # setblocking() method, and the Python fcntl module doesn't exist on - # Windows. (see eventlet.greenio.set_nonblocking()) As the sole purpose of - # this __init__() override is to wrap the pipes for eventlet-friendly - # non-blocking I/O, don't even bother overriding it on Windows. - if not subprocess_orig.mswindows: - def __init__(self, args, bufsize=0, *argss, **kwds): - self.args = args - # Forward the call to base-class constructor - subprocess_orig.Popen.__init__(self, args, 0, *argss, **kwds) - # Now wrap the pipes, if any. This logic is loosely borrowed from - # eventlet.processes.Process.run() method. - for attr in "stdin", "stdout", "stderr": - pipe = getattr(self, attr) - if pipe is not None and not type(pipe) == greenio.GreenPipe: - wrapped_pipe = greenio.GreenPipe(pipe, pipe.mode, bufsize) - setattr(self, attr, wrapped_pipe) - __init__.__doc__ = subprocess_orig.Popen.__init__.__doc__ - - def wait(self, timeout=None, check_interval=0.01): - # Instead of a blocking OS call, this version of wait() uses logic - # borrowed from the eventlet 0.2 processes.Process.wait() method. - if timeout is not None: - endtime = time.time() + timeout - try: - while True: - status = self.poll() - if status is not None: - return status - if timeout is not None and time.time() > endtime: - raise TimeoutExpired(self.args, timeout) - eventlet.sleep(check_interval) - except OSError as e: - if e.errno == errno.ECHILD: - # no child process, this happens if the child process - # already died and has been cleaned up - return -1 - else: - raise - wait.__doc__ = subprocess_orig.Popen.wait.__doc__ - - if not subprocess_orig.mswindows: - # don't want to rewrite the original _communicate() method, we - # just want a version that uses eventlet.green.select.select() - # instead of select.select(). - _communicate = FunctionType( - six.get_function_code(six.get_unbound_function( - subprocess_orig.Popen._communicate)), - globals()) - try: - _communicate_with_select = FunctionType( - six.get_function_code(six.get_unbound_function( - subprocess_orig.Popen._communicate_with_select)), - globals()) - _communicate_with_poll = FunctionType( - six.get_function_code(six.get_unbound_function( - subprocess_orig.Popen._communicate_with_poll)), - globals()) - except AttributeError: - pass - -# Borrow subprocess.call() and check_call(), but patch them so they reference -# OUR Popen class rather than subprocess.Popen. -call = FunctionType(six.get_function_code(subprocess_orig.call), globals()) -check_call = FunctionType(six.get_function_code(subprocess_orig.check_call), globals())