When using new Python 3.13 pyrepl on a read-only file system, attempting to exit the REPL raises the following exception: OSError: [Errno 30] Read-only file system: '/root/.python_history'. The same setup works with Python 3.12.
dev:/home/dev$ docker run -it --read-only python:3.12-slim-bookworm python3
Python 3.12.7 (main, Nov 12 2024, 02:26:49) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license"for more information.
>>> print('hello')
hello
>>> exit()
dev:/home/dev$ docker run -it --read-only python:3.13-slim-bookworm python3
Python 3.13.1 (main, Dec 4 2024, 20:40:24) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license"for more information.
>>> print('hello')
hello
>>> exit()
Exception ignored in atexit callback <function register_readline.<locals>.write_history at 0x7f56689a3600>:
Traceback (most recent call last):
File "<frozen site>", line 574, in write_history
File "/usr/local/lib/python3.13/_pyrepl/readline.py", line 453, in write_history_file
f = open(os.path.expanduser(filename), "w",
OSError: [Errno 30] Read-only file system: '/root/.python_history'
It's silly that we get this error only at the end of session.
Rather than catch OSError, maybe we should map EROFS errno to PermissionError on Linux. (Call to write_history_file() is wrapped with except (FileNotFoundError, PermissionError).)
Fix in hand. Tested locally by stealing the official Python image build dockerfile but using my own modified tarball with the fix.
╭─cpatti at rocinante in ~/src/personal 25-05-20 - 14:18:58
╰─○ docker run -it --read-only pyrepl_tst python3 <region:us-east-1>
zsh: correct 'python3' to 'python' [nyae]? n
Python 3.15.0a0 (heads/cpatti_issue_128066-dirty:01225ff4a74, May 20 2025, 18:17:11) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hellorld!")
Hellorld!
>>>
Activity
ZeroIntensity commented on Dec 18, 2024
I think the easiest fix would be to catch OSErrors there, and just log a warning if something goes wrong.
skirpichev commented on Dec 20, 2024
It's silly that we get this error only at the end of session.
Rather than catch OSError, maybe we should map EROFS errno to PermissionError on Linux. (Call to write_history_file() is wrapped with except (FileNotFoundError, PermissionError).)
Prevent issues like python#128066
feoh commented on May 20, 2025
Fix in hand. Tested locally by stealing the official Python image build dockerfile but using my own modified tarball with the fix.
╭─cpatti at rocinante in ~/src/personal 25-05-20 - 14:18:58 ╰─○ docker run -it --read-only pyrepl_tst python3 <region:us-east-1> zsh: correct 'python3' to 'python' [nyae]? n Python 3.15.0a0 (heads/cpatti_issue_128066-dirty:01225ff4a74, May 20 2025, 18:17:11) [GCC 12.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print("Hellorld!") Hellorld! >>>gh-128066: Properly handle history file writes for RO fs on PyREPL (g…
pythongh-128066: Properly handle history file writes for RO fs on PyR…
[3.13] pythongh-128066: Properly handle history file writes for RO fs…
[3.14] gh-128066: Properly handle history file writes for RO fs on Py…
[3.13] gh-128066: Properly handle history file writes for RO fs on Py…
pythongh-128066: Properly handle history file writes for RO fs on PyR…
pythongh-128066: Properly handle history file writes for RO fs on PyR…
pythongh-128066: Properly handle history file writes for RO fs on PyR…
pythongh-128066: Properly handle history file writes for RO fs on PyR…