repl buffering conflicts with sys.stdin
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 36k
- PR merge metrics
- PR metrics pending
Description
Bug report
When running the interpreter (python -i) the REPL appears to implement its own buffering, independent of sys.stdin and its internal buffer.
Consider the following (working) example, manually entered into the REPL via the keyboard:
$ python3 -i
Python 3.11.0 (main, Oct 24 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print('hello', sys.stdin.readline())
world
hello world
>>>
This appears to work only because at the time I hit <enter> after the print() line, the world isn't available to read yet, and therefore the repl can't possibly consume it. If I put the whole thing into a file, and cat it in one go, however:
$ cat example.py
import sys
print('hello', sys.stdin.readline())
world
$ cat example.py | python3 -i ST 12 peer
Python 3.11.0 (main, Oct 24 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> hello
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'world' is not defined
>>> >>>
We can see that readline() returns nothing at all, because world has already been consumed by the repl, which attempts (and fails) to interpret it as the next command to be executed.
You can work around this issue by inserting even the tiniest of pauses. Consider:
$ cat example.py
import sys
print('hello', sys.stdin.readline())
$ (cat example.py; echo world) | python3 -i
Python 3.11.0 (main, Oct 24 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> hello
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'world' is not defined
>>>
(ie: broken)
but:
$ (cat example.py; sleep 0.1; echo world) | python3 -i
Python 3.11.0 (main, Oct 24 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> hello world
(ie: working).
Your environment
Stock python3-3.11.0-1.fc37.x86_64 package installed on Fedora 37.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the python -i interpreter entry point and reproduce the behavior using the commands in the report, comparing immediate piped input with input delayed by sleep 0.1. Trace how the REPL consumes input relative to sys.stdin.readline(); done means piped input is not consumed by the REPL before the example reads it, with the reported reproductions behaving consistently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100