You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
New pyrepl gives a traceback on exit with "dumb" terminal #119102
$ export TERM=dumb
$ python3
Python 3.13.0b1 (main, May 12 2024, 23:38:03) [GCC 13.2.1 20240316 (Red Hat 13.2.1-7)] on linux
Type "help", "copyright", "credits" or "license" for more information.
warning: can't use pyrepl: terminal doesn't have the required clear capability
>>> quit
Use quit() or Ctrl-D (i.e. EOF) to exit
>>> quit()
Exception ignored in atexit callback <function register_readline.<locals>.write_history at 0x7f7204f537e0>:
Traceback (most recent call last):
File "<frozen site>", line 530, in write_history
File "/home/duncan/py313inst/lib/python3.13/_pyrepl/readline.py", line 361, in write_history_file
history = self.get_reader().get_trimmed_history(maxlength)
File "/home/duncan/py313inst/lib/python3.13/_pyrepl/readline.py", line 277, in get_reader
console = UnixConsole(self.f_in, self.f_out, encoding=ENCODING)
File "/home/duncan/omni/py313inst/lib/python3.13/_pyrepl/unix_console.py", line 170, in __init__
self._clear = _my_getstr("clear")
File "/home/duncan/py313inst/lib/python3.13/_pyrepl/unix_console.py", line 163, in _my_getstr
raise InvalidTerminal(
_pyrepl.unix_console.InvalidTerminal: terminal doesn't have the required clear capability
It notices that the terminal is unsuitable, but then tries to use it on exit.
defwrite_history():
try:
ifos.getenv("PYTHON_BASIC_REPL"):
readline.write_history_file(history)
else:
_pyrepl.readline.write_history_file(history)
except (FileNotFoundError, PermissionError):
# home directory does not exist or is not writable# https://bugs.python.org/issue19891pass
It clearly needs to get more clever to detect whether pyrepl is actually in use.
Maybe it can just look at the _pyrepl.__main__.CAN_USE_PYREPL global.
@eugenetriguba if you look at the _pyrepl/__main__.py, CAN_USE_PYREPL is indeed checking for windows at import, but then later it is set to False if for any reason the new repl cannot be used, on line 41.
I tried to fix this by checking CAN_USE_PYREPL in the write_history callback function but couldn't make it work -- accessing CAN_USE_PYREPL from __main__ module seems to be cursed, and moving it to __init__ did not help.
@danielhollas I worked with @lysnikolaou during PyCon sprints on this one, we came to the same conclusion but he said this is not the best practice to export the env variable to the system. He said he will take a deeper look as to why this might be happening
Activity
danielhollas commentedon May 17, 2024
Looks like the
write_historycallback is registered insite.pyhere:cpython/Lib/site.py
Line 525 in 65de194
It clearly needs to get more clever to detect whether pyrepl is actually in use.
Maybe it can just look at the
_pyrepl.__main__.CAN_USE_PYREPLglobal.eugenetriguba commentedon May 20, 2024
@danielhollas
CAN_USE_PYREPLjust checks whether we're on a Windows system, so I wouldn't think checking that would help in this case.Maybe: We set PYTHON_BASIC_REPL to true if TERM is set to "dumb"?
danielhollas commentedon May 20, 2024
@eugenetriguba if you look at the
_pyrepl/__main__.py,CAN_USE_PYREPLis indeed checking for windows at import, but then later it is set to False if for any reason the new repl cannot be used, on line 41.I tried to fix this by checking CAN_USE_PYREPL in the
write_historycallback function but couldn't make it work -- accessing CAN_USE_PYREPL from__main__module seems to be cursed, and moving it to__init__did not help.danielhollas commentedon May 20, 2024
The following patch indeed fixes the issue, happy to make a PR if this seems like a right approach
mi1acl commentedon May 20, 2024
@danielhollas I worked with @lysnikolaou during PyCon sprints on this one, we came to the same conclusion but he said this is not the best practice to export the env variable to the system. He said he will take a deeper look as to why this might be happening
vstinner commentedon May 20, 2024
Maybe add a
site._CAN_USE_PYREPLconstant and modify_pyrepl/__main__.pyto setsite._CAN_USE_PYREPL?mi1acl commentedon May 20, 2024
I can do this if it's ok
pythongh-119102: Fix REPL for dumb terminal
pythongh-119102: Fix REPL for dumb terminal
pythongh-119102: Fix REPL for dumb terminal
vstinner commentedon May 20, 2024
I proposed PR gh-119269 to fix this issue.
pythongh-119102: Fix REPL for dumb terminal
gh-119102: Fix REPL for dumb terminal (#119269)
pythongh-119102: Fix REPL for dumb terminal (pythonGH-119269)
[3.13] gh-119102: Fix REPL for dumb terminal (GH-119269) (#119308)
lysnikolaou commentedon May 21, 2024
Leaving this open since #119269 did not fix the problem.
pythongh-119102: Fix REPL for dumb terminal
pythongh-119102: Fix REPL for dumb terminal
vstinner commentedon May 21, 2024
Please check my second fix: PR gh-119332.
gh-119102: Fix REPL for dumb terminal (#119332)
pythongh-119102: Fix REPL for dumb terminal (pythonGH-119332)
[3.13] gh-119102: Fix REPL for dumb terminal (GH-119332) (#119359)
vstinner commentedon May 22, 2024
This time, it should be fixed.
pythongh-119102: Fix REPL for dumb terminal (python#119269)
pythongh-119102: Fix REPL for dumb terminal (python#119332)