219 Returns (fin, fout) which point to the original (uin, uout) fds, but |
219 Returns (fin, fout) which point to the original (uin, uout) fds, but |
220 may be copy of (uin, uout). The returned streams can be considered |
220 may be copy of (uin, uout). The returned streams can be considered |
221 "owned" in that print(), exec(), etc. never reach to them. |
221 "owned" in that print(), exec(), etc. never reach to them. |
222 """ |
222 """ |
223 uout.flush() |
223 uout.flush() |
224 newfiles = [] |
|
225 nullfd = os.open(os.devnull, os.O_RDWR) |
224 nullfd = os.open(os.devnull, os.O_RDWR) |
226 for f, sysf, mode in [(uin, stdin, r'rb'), |
225 fin, fout = uin, uout |
227 (uout, stdout, r'wb')]: |
226 if uin is stdin: |
228 if f is sysf: |
227 newfd = os.dup(uin.fileno()) |
229 newfd = os.dup(f.fileno()) |
228 os.dup2(nullfd, uin.fileno()) |
230 os.dup2(nullfd, f.fileno()) |
229 fin = os.fdopen(newfd, r'rb') |
231 f = os.fdopen(newfd, mode) |
230 if uout is stdout: |
232 newfiles.append(f) |
231 newfd = os.dup(uout.fileno()) |
|
232 os.dup2(nullfd, uout.fileno()) |
|
233 fout = os.fdopen(newfd, r'wb') |
233 os.close(nullfd) |
234 os.close(nullfd) |
234 return tuple(newfiles) |
235 return fin, fout |
235 |
236 |
236 def restorestdio(uin, uout, fin, fout): |
237 def restorestdio(uin, uout, fin, fout): |
237 """Restore (uin, uout) streams from possibly duplicated (fin, fout)""" |
238 """Restore (uin, uout) streams from possibly duplicated (fin, fout)""" |
238 uout.flush() |
239 uout.flush() |
239 for f, uif in [(fin, uin), (fout, uout)]: |
240 for f, uif in [(fin, uin), (fout, uout)]: |