equal
deleted
inserted
replaced
7 # This software may be used and distributed according to the terms of the |
7 # This software may be used and distributed according to the terms of the |
8 # GNU General Public License version 2 or any later version. |
8 # GNU General Public License version 2 or any later version. |
9 |
9 |
10 from __future__ import absolute_import |
10 from __future__ import absolute_import |
11 |
11 |
|
12 import contextlib |
12 import imp |
13 import imp |
13 import io |
14 import io |
14 import os |
15 import os |
15 import signal |
16 import signal |
16 import subprocess |
17 import subprocess |
238 for f, uif in [(fin, uin), (fout, uout)]: |
239 for f, uif in [(fin, uin), (fout, uout)]: |
239 if f is not uif: |
240 if f is not uif: |
240 os.dup2(f.fileno(), uif.fileno()) |
241 os.dup2(f.fileno(), uif.fileno()) |
241 f.close() |
242 f.close() |
242 |
243 |
|
244 @contextlib.contextmanager |
|
245 def protectedstdio(uin, uout): |
|
246 """Run code block with protected standard streams""" |
|
247 fin, fout = protectstdio(uin, uout) |
|
248 try: |
|
249 yield fin, fout |
|
250 finally: |
|
251 restorestdio(uin, uout, fin, fout) |
|
252 |
243 def shellenviron(environ=None): |
253 def shellenviron(environ=None): |
244 """return environ with optional override, useful for shelling out""" |
254 """return environ with optional override, useful for shelling out""" |
245 def py2shell(val): |
255 def py2shell(val): |
246 'convert python object into string that is useful to shell' |
256 'convert python object into string that is useful to shell' |
247 if val is None or val is False: |
257 if val is None or val is False: |