Author: Armin Rigo <[email protected]>
Branch:
Changeset: r94805:6ee028a07651
Date: 2018-07-05 17:01 +0200
http://bitbucket.org/pypy/pypy/changeset/6ee028a07651/
Log: Issue #2837
Write an end-of-line and flush stdout when an exception is about to
be printed in code.py. Needed to emulate CPython's interactive
command line behaviour more closely, and good to avoid strange
effects.
diff --git a/lib-python/2.7/code.py b/lib-python/2.7/code.py
--- a/lib-python/2.7/code.py
+++ b/lib-python/2.7/code.py
@@ -104,6 +104,12 @@
except SystemExit:
raise
except:
+ if softspace(sys.stdout, 0):
+ print
+ try:
+ sys.stdout.flush()
+ except:
+ pass
self.showtraceback()
else:
if softspace(sys.stdout, 0):
diff --git a/pypy/module/test_lib_pypy/test_code_extra.py
b/pypy/module/test_lib_pypy/test_code_extra.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/test_code_extra.py
@@ -0,0 +1,19 @@
+import py
+import sys
+import cStringIO
+import code
+
+
+def test_flush_stdout_on_error():
+ runner = code.InteractiveInterpreter()
+ old_stdout = sys.stdout
+ try:
+ mystdout = cStringIO.StringIO()
+ sys.stdout = mystdout
+ runner.runcode(compile("print 5,;0/0", "<interactive>", "exec"))
+ finally:
+ sys.stdout = old_stdout
+
+ if '__pypy__' not in sys.builtin_module_names:
+ py.test.skip('pypy only test')
+ assert mystdout.getvalue() == "5\n"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit