repl buffering conflicts with sys.stdin
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 36k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
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.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginnen Sie mit dem python -i-Interpreter-Einstiegspunkt und reproduzieren Sie das Verhalten mithilfe der im Bericht angegebenen Befehle, wobei Sie sofort weitergeleitete Eingaben mit Eingaben vergleichen, die durch sleep 0.1 verzögert werden. Verfolgen Sie, wie die REPL Eingaben im Verhältnis zu sys.stdin.readline() konsumiert; als erledigt gilt die Aufgabe, wenn weitergeleitete Eingaben nicht von der REPL konsumiert werden, bevor das Beispiel sie liest, und sich die im Bericht angegebenen Reproduktionen konsistent verhalten.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- cli
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100