Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2016-02-04 09:40:02 +0300
committerCampbell Barton <ideasman42@gmail.com>2016-02-04 09:40:02 +0300
commitd8a998ce71f5dafa1f5681158bad8225ca289408 (patch)
tree30e521fce21ce3962d5f1f1eee034ae012d6afb6 /release/scripts/modules/console_python.py
parent0034765208f7b22077fdd75395eb5ebb2aeb8629 (diff)
Use contextlib for temporary py console overrides
Using context overrides means stdout/stderr overrides can't be left set by accident.
Diffstat (limited to 'release/scripts/modules/console_python.py')
-rw-r--r--release/scripts/modules/console_python.py52
1 files changed, 27 insertions, 25 deletions
diff --git a/release/scripts/modules/console_python.py b/release/scripts/modules/console_python.py
index 59e4f2314d8..64bb002d6a1 100644
--- a/release/scripts/modules/console_python.py
+++ b/release/scripts/modules/console_python.py
@@ -136,33 +136,40 @@ def execute(context, is_interactive):
console, stdout, stderr = get_console(hash(context.region))
- # redirect output
- sys.stdout = stdout
- sys.stderr = stderr
-
- # don't allow the stdin to be used, can lock blender.
- stdin_backup = sys.stdin
- sys.stdin = None
-
if _BPY_MAIN_OWN:
main_mod_back = sys.modules["__main__"]
sys.modules["__main__"] = console._bpy_main_mod
- # in case exception happens
- line = "" # in case of encoding error
- is_multiline = False
+ # redirect output
+ from contextlib import (
+ redirect_stdout,
+ redirect_stderr,
+ )
+
+ # not included with Python
+ class redirect_stdin(redirect_stdout.__base__):
+ _stream = "stdin"
- try:
- line = line_object.body
+ # don't allow the stdin to be used, can lock blender.
+ with redirect_stdout(stdout), \
+ redirect_stderr(stderr), \
+ redirect_stdin(None):
- # run the console, "\n" executes a multi line statement
- line_exec = line if line.strip() else "\n"
+ # in case exception happens
+ line = "" # in case of encoding error
+ is_multiline = False
- is_multiline = console.push(line_exec)
- except:
- # unlikely, but this can happen with unicode errors for example.
- import traceback
- stderr.write(traceback.format_exc())
+ try:
+ line = line_object.body
+
+ # run the console, "\n" executes a multi line statement
+ line_exec = line if line.strip() else "\n"
+
+ is_multiline = console.push(line_exec)
+ except:
+ # unlikely, but this can happen with unicode errors for example.
+ import traceback
+ stderr.write(traceback.format_exc())
if _BPY_MAIN_OWN:
sys.modules["__main__"] = main_mod_back
@@ -174,8 +181,6 @@ def execute(context, is_interactive):
output_err = stderr.read()
# cleanup
- sys.stdout = sys.__stdout__
- sys.stderr = sys.__stderr__
sys.last_traceback = None
# So we can reuse, clear all data
@@ -213,9 +218,6 @@ def execute(context, is_interactive):
if output_err:
add_scrollback(output_err, 'ERROR')
- # restore the stdin
- sys.stdin = stdin_backup
-
# execute any hooks
for func, args in execute.hooks:
func(*args)