Skip to content

Commit 81237f4

Browse files
authored
Update setup.py
Fix stdout redirection error on Window 10 OS.
1 parent 37c9a05 commit 81237f4

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

setup.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import sys
2323
import subprocess
2424
import time
25+
import io
26+
import six
2527
from contextlib import contextmanager
2628

2729
join = os.path.join
@@ -190,16 +192,29 @@ def stdout_redirected(new_stdout='install.log'):
190192
finally:
191193
return
192194

193-
old = os.dup(1)
194-
os.close(1)
195-
os.open(new_stdout, os.O_WRONLY | os.O_CREAT)
195+
install_log_file_fid = os.open(new_stdout, os.O_WRONLY | os.O_CREAT)
196+
original_stdout_fid = sys.stdout.fileno()
197+
copied_stdout_fid = os.dup(original_stdout_fid)
198+
199+
def _redirect(to_fid):
200+
# Flush and close the Python-level file object, not the C file descriptor
201+
sys.stdout.close()
202+
# Point original_stdout_fid to to_fid
203+
os.dup2(to_fid,original_stdout_fid)
204+
# Create sys.stdout
205+
if six.PY3:
206+
sys.stdout = io.TextIOWrapper(os.fdopen(original_stdout_fid,'wb'))
207+
else:
208+
sys.stdout = os.fdopen(original_stdout_fid,'wb')
196209

197210
try:
198-
yield None
199-
finally:
200-
os.close(1)
201-
os.dup2(old,1)
202-
os.close(old)
211+
_redirect(install_log_file_fid)
212+
yield
213+
_redirect(copied_stdout_fid)
214+
finally:
215+
os.fsync(install_log_file_fid)
216+
os.close(install_log_file_fid)
217+
os.close(copied_stdout_fid)
203218

204219

205220
def setup_package(setup_dict, subpackages):

0 commit comments

Comments
 (0)