diff options
author | Ondřej Čertík <ondrej.certik@gmail.com> | 2013-03-24 09:45:29 -0700 |
---|---|---|
committer | Ondřej Čertík <ondrej.certik@gmail.com> | 2013-03-24 09:45:29 -0700 |
commit | c96c69bf2c133c9c68480e3cb532693fb942c051 (patch) | |
tree | 989e00edee5034842ab80788d872ae6bab62b3ad /numpy/distutils/exec_command.py | |
parent | bd7104cef45be9a4250cb67af9225c9606498a51 (diff) | |
parent | 5099683c351929e938985fd770b0a03cf7285ecb (diff) | |
download | numpy-c96c69bf2c133c9c68480e3cb532693fb942c051.tar.gz |
Merge pull request #3128 from certik/pull-request-3127
BUG: fix issue with distutils.exec_command introduced in 1.7.0.
Diffstat (limited to 'numpy/distutils/exec_command.py')
-rw-r--r-- | numpy/distutils/exec_command.py | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/numpy/distutils/exec_command.py b/numpy/distutils/exec_command.py index f05b56429..a469fc5e0 100644 --- a/numpy/distutils/exec_command.py +++ b/numpy/distutils/exec_command.py @@ -141,6 +141,19 @@ def _update_environment( **env ): for name,value in env.items(): os.environ[name] = value or '' +def _supports_fileno(stream): + """ + Returns True if 'stream' supports the file descriptor and allows fileno(). + """ + if hasattr(stream, 'fileno'): + try: + r = stream.fileno() + return True + except IOError: + return False + else: + return False + def exec_command( command, execute_in='', use_shell=None, use_tee = None, _with_python = 1, @@ -195,7 +208,8 @@ def exec_command( command, # _exec_command_posix uses os.system and is faster # but not on all platforms os.system will return # a correct status. - if _with_python and sys.stdout.fileno() == -1: + if (_with_python and _supports_fileno(sys.stdout) and + sys.stdout.fileno() == -1): st = _exec_command_python(command, exec_command_dir = exec_dir, **env) @@ -349,12 +363,16 @@ def _exec_command( command, use_shell=None, use_tee = None, **env ): argv = [os.environ['COMSPEC'],'/C'] + argv using_command = 1 - so_fileno = sys.stdout.fileno() - se_fileno = sys.stderr.fileno() + _so_has_fileno = _supports_fileno(sys.stdout) + _se_has_fileno = _supports_fileno(sys.stderr) so_flush = sys.stdout.flush se_flush = sys.stderr.flush - so_dup = os.dup(so_fileno) - se_dup = os.dup(se_fileno) + if _so_has_fileno: + so_fileno = sys.stdout.fileno() + so_dup = os.dup(so_fileno) + if _se_has_fileno: + se_fileno = sys.stderr.fileno() + se_dup = os.dup(se_fileno) outfile = temp_file_name() fout = open(outfile,'w') @@ -371,13 +389,16 @@ def _exec_command( command, use_shell=None, use_tee = None, **env ): so_flush() se_flush() - os.dup2(fout.fileno(),so_fileno) - if using_command: - #XXX: disabled for now as it does not work from cmd under win32. - # Tests fail on msys - os.dup2(ferr.fileno(),se_fileno) - else: - os.dup2(fout.fileno(),se_fileno) + if _so_has_fileno: + os.dup2(fout.fileno(),so_fileno) + + if _se_has_fileno: + if using_command: + #XXX: disabled for now as it does not work from cmd under win32. + # Tests fail on msys + os.dup2(ferr.fileno(),se_fileno) + else: + os.dup2(fout.fileno(),se_fileno) try: status = spawn_command(os.P_WAIT,argv0,argv,os.environ) except OSError: @@ -387,8 +408,10 @@ def _exec_command( command, use_shell=None, use_tee = None, **env ): so_flush() se_flush() - os.dup2(so_dup,so_fileno) - os.dup2(se_dup,se_fileno) + if _so_has_fileno: + os.dup2(so_dup,so_fileno) + if _se_has_fileno: + os.dup2(se_dup,se_fileno) fout.close() fout = open_latin1(outfile,'r') |