On Wed, 08/24 20:30, Sascha Silbe wrote: > Unlike Popen.communicate(), subprocess.call() doesn't read from the > stdout file descriptor. If the child process produces more output than > fits into the pipe buffer, it will block indefinitely. > > If we don't intend to consume the output, just send it straight to > /dev/null to avoid this issue. > > Signed-off-by: Sascha Silbe <si...@linux.vnet.ibm.com> > Reviewed-by: Janosch Frank <fran...@linux.vnet.ibm.com> > --- > This fixes a hang for me when building the Ubuntu docker image (empty > docker image cache). > > tests/docker/docker.py | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/tests/docker/docker.py b/tests/docker/docker.py > index 222a105..efb2bf4 100755 > --- a/tests/docker/docker.py > +++ b/tests/docker/docker.py > @@ -25,6 +25,10 @@ from tarfile import TarFile, TarInfo > from StringIO import StringIO > from shutil import copy, rmtree > > + > +DEVNULL = open(os.devnull, 'wb') > + > +
Too many blank lines? Otherwise looks good. > def _text_checksum(text): > """Calculate a digest string unique to the text content""" > return hashlib.sha1(text).hexdigest() > @@ -34,8 +38,7 @@ def _guess_docker_command(): > commands = [["docker"], ["sudo", "-n", "docker"]] > for cmd in commands: > if subprocess.call(cmd + ["images"], > - stdout=subprocess.PIPE, > - stderr=subprocess.PIPE) == 0: > + stdout=DEVNULL, stderr=DEVNULL) == 0: > return cmd > commands_txt = "\n".join([" " + " ".join(x) for x in commands]) > raise Exception("Cannot find working docker command. Tried:\n%s" % \ > @@ -98,7 +101,7 @@ class Docker(object): > > def _do(self, cmd, quiet=True, infile=None, **kwargs): > if quiet: > - kwargs["stdout"] = subprocess.PIPE > + kwargs["stdout"] = DEVNULL > if infile: > kwargs["stdin"] = infile > return subprocess.call(self._command + cmd, **kwargs) > -- > 1.9.1 >