repl buffering conflicts with sys.stdin
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 36k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
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.
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Comece pelo ponto de entrada do interpretador python -i e reproduza o comportamento usando os comandos do relatório, comparando a entrada canalizada imediatamente com a entrada atrasada por sleep 0.1. Rastreie como a REPL consome a entrada em relação a sys.stdin.readline(); considera-se concluído quando a entrada canalizada não é consumida pela REPL antes de o exemplo lê-la, e as reproduções relatadas se comportam de forma consistente.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python
- Domínio
- cli
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 35/100