From 7a553c569f7c5e52e755d44e6cfe5e1f5cc97168 Mon Sep 17 00:00:00 2001 From: Derrick Bryant Date: Fri, 31 Mar 2017 11:32:47 -0700 Subject: [PATCH] Add option for real time Terraform output --- README.md | 12 +++++++++++- python_terraform/__init__.py | 22 +++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 863e03f..68a6e7a 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,16 @@ In python-terraform: from python_terraform import Terraform tf = terraform(working_dir='/home/test') tf.fmt(diff=True) + +# Terraform Output + +By default, stdout and stderr are captured and returned. This causes the application to appear to hang. To print terraform output in real time, provide the `capture_output` option with any value other than `None`. This will cause the output of terraform to be printed to the terminal in real time. The value of `stdout` and `stderr` below will be `None`. + + + from python_terraform import Terraform + t = Terraform() + return_code, stdout, stderr = t.(capture_output=False) + ## default values for apply/plan/destroy command, assign with following default value to make @@ -120,4 +130,4 @@ like `-no-color` and `True/False` value reserved for option like `refresh=true` - \ No newline at end of file + diff --git a/python_terraform/__init__.py b/python_terraform/__init__.py index 6ed9362..769350e 100644 --- a/python_terraform/__init__.py +++ b/python_terraform/__init__.py @@ -3,6 +3,7 @@ import subprocess import os +import sys import json import logging import tempfile @@ -202,15 +203,27 @@ class Terraform(object): if it's a flag could be used multiple times, assign list to it's value if it's a "var" variable flag, assign dictionary to it if a value is None, will skip this option + if the option 'capture_output' is passed (with any value other than + True), terraform output will be printed to stdout/stderr and + "None" will be returned as out and err. :return: ret_code, out, err """ + + capture_output = kwargs.pop('capture_output', True) + if capture_output is True: + stderr = subprocess.PIPE + stdout = subprocess.PIPE + else: + stderr = sys.stderr + stdout = sys.stdout + cmd_string = self.generate_cmd_string(cmd, *args, **kwargs) log.debug('command: {c}'.format(c=cmd_string)) working_folder = self.working_dir if self.working_dir else None - p = subprocess.Popen(cmd_string, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, shell=True, + p = subprocess.Popen(cmd_string, stdout=stdout, + stderr=stderr, shell=True, cwd=working_folder) out, err = p.communicate() ret_code = p.returncode @@ -222,7 +235,10 @@ class Terraform(object): log.warn('error: {e}'.format(e=err)) self.temp_var_files.clean_up() - return ret_code, out.decode('utf-8'), err.decode('utf-8') + if capture_output is True: + return ret_code, out.decode('utf-8'), err.decode('utf-8') + else: + return ret_code, None, None def output(self, name): """