summaryrefslogtreecommitdiff
path: root/numpy/distutils/exec_command.py
diff options
context:
space:
mode:
authorOndřej Čertík <ondrej.certik@gmail.com>2013-03-24 09:45:29 -0700
committerOndřej Čertík <ondrej.certik@gmail.com>2013-03-24 09:45:29 -0700
commitc96c69bf2c133c9c68480e3cb532693fb942c051 (patch)
tree989e00edee5034842ab80788d872ae6bab62b3ad /numpy/distutils/exec_command.py
parentbd7104cef45be9a4250cb67af9225c9606498a51 (diff)
parent5099683c351929e938985fd770b0a03cf7285ecb (diff)
downloadnumpy-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.py51
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')