Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
1c33280c
Commit
1c33280c
authored
May 11, 2014
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Plain Diff
Issue #21425: Fix flushing of standard streams in the interactive interpreter.
parents
c89a451a
9845c7eb
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
56 additions
and
3 deletions
+56
-3
Lib/test/script_helper.py
Lib/test/script_helper.py
+2
-2
Lib/test/test_cmd_line_script.py
Lib/test/test_cmd_line_script.py
+49
-0
Misc/NEWS
Misc/NEWS
+3
-0
Python/pythonrun.c
Python/pythonrun.c
+2
-1
No files found.
Lib/test/script_helper.py
View file @
1c33280c
...
...
@@ -78,7 +78,7 @@ def assert_python_failure(*args, **env_vars):
"""
return
_assert_python
(
False
,
*
args
,
**
env_vars
)
def
spawn_python
(
*
args
,
**
kw
):
def
spawn_python
(
*
args
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
,
**
kw
):
"""Run a Python subprocess with the given arguments.
kw is extra keyword args to pass to subprocess.Popen. Returns a Popen
...
...
@@ -87,7 +87,7 @@ def spawn_python(*args, **kw):
cmd_line
=
[
sys
.
executable
,
'-E'
]
cmd_line
.
extend
(
args
)
return
subprocess
.
Popen
(
cmd_line
,
stdin
=
subprocess
.
PIPE
,
stdout
=
s
ubprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
,
stdout
=
s
tdout
,
stderr
=
stderr
,
**
kw
)
def
kill_python
(
p
):
...
...
Lib/test/test_cmd_line_script.py
View file @
1c33280c
# tests command line execution of scripts
import
contextlib
import
importlib
import
importlib.machinery
import
zipimport
...
...
@@ -8,6 +9,7 @@ import sys
import
os
import
os.path
import
py_compile
import
subprocess
import
textwrap
from
test
import
support
...
...
@@ -173,6 +175,53 @@ class CmdLineTest(unittest.TestCase):
expected
=
repr
(
importlib
.
machinery
.
BuiltinImporter
).
encode
(
"utf-8"
)
self
.
assertIn
(
expected
,
out
)
@
contextlib
.
contextmanager
def
interactive_python
(
self
,
separate_stderr
=
False
):
if
separate_stderr
:
p
=
spawn_python
(
'-i'
,
bufsize
=
1
,
stderr
=
subprocess
.
PIPE
)
stderr
=
p
.
stderr
else
:
p
=
spawn_python
(
'-i'
,
bufsize
=
1
,
stderr
=
subprocess
.
STDOUT
)
stderr
=
p
.
stdout
try
:
# Drain stderr until prompt
while
True
:
data
=
stderr
.
read
(
4
)
if
data
==
b">>> "
:
break
stderr
.
readline
()
yield
p
finally
:
kill_python
(
p
)
stderr
.
close
()
def
check_repl_stdout_flush
(
self
,
separate_stderr
=
False
):
with
self
.
interactive_python
(
separate_stderr
)
as
p
:
p
.
stdin
.
write
(
b"print('foo')
\
n
"
)
p
.
stdin
.
flush
()
self
.
assertEqual
(
b'foo'
,
p
.
stdout
.
readline
().
strip
())
def
check_repl_stderr_flush
(
self
,
separate_stderr
=
False
):
with
self
.
interactive_python
(
separate_stderr
)
as
p
:
p
.
stdin
.
write
(
b"1/0
\
n
"
)
p
.
stdin
.
flush
()
stderr
=
p
.
stderr
if
separate_stderr
else
p
.
stdout
self
.
assertIn
(
b'Traceback '
,
stderr
.
readline
())
self
.
assertIn
(
b'File "<stdin>"'
,
stderr
.
readline
())
self
.
assertIn
(
b'ZeroDivisionError'
,
stderr
.
readline
())
def
test_repl_stdout_flush
(
self
):
self
.
check_repl_stdout_flush
()
def
test_repl_stdout_flush_separate_stderr
(
self
):
self
.
check_repl_stdout_flush
(
True
)
def
test_repl_stderr_flush
(
self
):
self
.
check_repl_stderr_flush
()
def
test_repl_stderr_flush_separate_stderr
(
self
):
self
.
check_repl_stderr_flush
(
True
)
def
test_basic_script
(
self
):
with
temp_dir
()
as
script_dir
:
script_name
=
_make_test_script
(
script_dir
,
'script'
)
...
...
Misc/NEWS
View file @
1c33280c
...
...
@@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins
-----------------
- Issue #21425: Fix flushing of standard streams in the interactive
interpreter.
- Issue #21435: In rare cases, when running finalizers on objects in cyclic
trash a bad pointer dereference could occur due to a subtle flaw in
internal iteration logic.
...
...
Python/pythonrun.c
View file @
1c33280c
...
...
@@ -1453,12 +1453,13 @@ PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags)
d
=
PyModule_GetDict
(
m
);
v
=
run_mod
(
mod
,
filename
,
d
,
d
,
flags
,
arena
);
PyArena_Free
(
arena
);
flush_io
();
if
(
v
==
NULL
)
{
PyErr_Print
();
flush_io
();
return
-
1
;
}
Py_DECREF
(
v
);
flush_io
();
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment