Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[core] SpooledTemporaryFile for subprocess output #3002

Merged
merged 1 commit into from
Nov 11, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 5 additions & 7 deletions utils/subprocess_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,27 @@
# Licensed under Simplified BSD License (see LICENSE)

# stdlib
from contextlib import nested
from functools import wraps
import logging
import subprocess
import tempfile

log = logging.getLogger(__name__)


class SubprocessOutputEmptyError(Exception):
pass

# FIXME: python 2.7 has a far better way to do this

def get_subprocess_output(command, log, raise_on_empty_output=True):
"""
Run the given subprocess command and return it's output. Raise an Exception
Run the given subprocess command and return its output. Raise an Exception
if an error occurs.
"""

# Use tempfile, allowing a larger amount of memory. The subprocess.Popen
# docs warn that the data read is buffered in memory. They suggest not to
# use subprocess.PIPE if the data size is large or unlimited.
with nested(tempfile.TemporaryFile(), tempfile.TemporaryFile()) as (stdout_f, stderr_f):
max_size = 1024 * 1024 # 1 MB

with tempfile.SpooledTemporaryFile(max_size=max_size) as stdout_f, tempfile.SpooledTemporaryFile(max_size=max_size) as stderr_f:
proc = subprocess.Popen(command, stdout=stdout_f, stderr=stderr_f)
proc.wait()
stderr_f.seek(0)
Expand Down