subprocess.check_output() doesn't seem to exist (Python 2.6.5)

前端 未结 3 885
逝去的感伤
逝去的感伤 2020-11-28 22:25

I\'ve been reading the Python documentation about the subprocess module (see here) and it talks about a subprocess.check_output() command which seems to be exac

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-28 23:01

    Thanks to the monkey patch suggestion (and my attempts failing - but we were consuming CalledProcessError output, so needed to monkey patch that)

    found a working 2.6 patch here: http://pydoc.net/Python/pep8radius/0.9.0/pep8radius.shell/

    """Note: We also monkey-patch subprocess for python 2.6 to
    give feature parity with later versions.
    """
    try:
        from subprocess import STDOUT, check_output, CalledProcessError
    except ImportError:  # pragma: no cover
        # python 2.6 doesn't include check_output
        # monkey patch it in!
        import subprocess
        STDOUT = subprocess.STDOUT
    
        def check_output(*popenargs, **kwargs):
            if 'stdout' in kwargs:  # pragma: no cover
                raise ValueError('stdout argument not allowed, '
                                 'it will be overridden.')
            process = subprocess.Popen(stdout=subprocess.PIPE,
                                       *popenargs, **kwargs)
            output, _ = process.communicate()
            retcode = process.poll()
            if retcode:
                cmd = kwargs.get("args")
                if cmd is None:
                    cmd = popenargs[0]
                raise subprocess.CalledProcessError(retcode, cmd,
                                                    output=output)
            return output
        subprocess.check_output = check_output
    
        # overwrite CalledProcessError due to `output`
        # keyword not being available (in 2.6)
        class CalledProcessError(Exception):
    
            def __init__(self, returncode, cmd, output=None):
                self.returncode = returncode
                self.cmd = cmd
                self.output = output
    
            def __str__(self):
                return "Command '%s' returned non-zero exit status %d" % (
                    self.cmd, self.returncode)
        subprocess.CalledProcessError = CalledProcessError
    

提交回复
热议问题