changeset 211:d1ead1bfcc65

Follow-up to [219]: Input to processes now also implemented for Windows.
author cmlenz
date Tue, 20 Sep 2005 16:31:03 +0000
parents c550e31c06d2
children 62b668fc713d
files bitten/build/api.py
diffstat 1 files changed, 39 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/build/api.py
+++ b/bitten/build/api.py
@@ -59,18 +59,46 @@
                 os.chdir(self.cwd)
 
             import tempfile
-            out_name = tempfile.mktemp()
-            err_name = tempfile.mktemp()
-            cmd = "( %s ) > %s 2> %s" % (' '.join(args), out_name, err_name)
-            self.returncode = os.system(cmd)
-            log.debug('Exited with code %s', self.returncode)
+            in_name = None
+            if self.input:
+                if isinstance(self.input, basestring):
+                    in_file, in_name = tempfile.mkstemp(prefix='bitten_',
+                                                        suffix='.pipe')
+                    os.write(in_file, self.input)
+                    os.close(in_file)
+                    in_redirect = '< "%s" ' % in_name
+                else:
+                    in_redirect = '< "%s" ' % self.input.name
+            else:
+                in_redirect = ''
 
-            out_file = file(out_name, 'r')
-            err_file = file(err_name, 'r')
-            out_lines = out_file.readlines()
-            err_lines = err_file.readlines()
-            out_file.close()
-            err_file.close()
+            out_file, out_name = tempfile.mkstemp(prefix='bitten_',
+                                                  suffix='.pipe')
+            os.close(out_file)
+            err_file, err_name = tempfile.mkstemp(prefix='bitten_',
+                                                  suffix='.pipe')
+            os.close(err_file)
+
+            try:
+                cmd = '( %s ) > "%s" %s 2> "%s"' % (' '.join(args), out_name,
+                                                    in_redirect, err_name)
+                self.returncode = os.system(cmd)
+                log.debug('Exited with code %s', self.returncode)
+
+                out_file = file(out_name, 'r')
+                err_file = file(err_name, 'r')
+                out_lines = out_file.readlines()
+                err_lines = err_file.readlines()
+                out_file.close()
+                err_file.close()
+            finally:
+                if in_name:
+                    os.unlink(in_name)
+                if out_name:
+                    os.unlink(out_name)
+                if err_name:
+                    os.unlink(err_name)
+
             for out_line, err_line in self._combine(out_lines, err_lines):
                 yield out_line and out_line.rstrip(), \
                       err_line and err_line.rstrip()
Copyright (C) 2012-2017 Edgewall Software