LibreOffice 4.0 got released on 7th February, and since it offered improved OOXML interoperability, I immediately downloaded and installed it on my laptop. It worked quite well, but after the next boot, it just flashed the window for a tenth of a second, and displayed the following output on the console.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
Traceback (most recent call last):
File "<frozen importlib._bootstrap>", line 1558, in _find_and_load
File "<frozen importlib._bootstrap>", line 1525, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 586, in _check_name_wrapper
File "<frozen importlib._bootstrap>", line 1023, in load_module
File "<frozen importlib._bootstrap>", line 1004, in load_module
File "<frozen importlib._bootstrap>", line 562, in module_for_loader_wrapper
File "<frozen importlib._bootstrap>", line 854, in _load_module
File "<frozen importlib._bootstrap>", line 990, in get_code
File "<frozen importlib._bootstrap>", line 1051, in _cache_bytecode
File "<frozen importlib._bootstrap>", line 1065, in set_data
OSError: [Errno 30] Read-only file system: '/usr/local/opt/libreoffice4.0/program/../program/python-core-3.3.0/lib/encodings/__pycache__'
I symlinked /opt
to /usr/local/opt
, and for many reasons (including
faster boot, storing /usr
on an SSD) I mount /usr
in read-only mode by
default, and use the following snippet in /etc/apt/apt.conf.d/12remount
to do the magic upon system upgrade and software installs.
DPkg
{
Pre-Invoke {"mount -o remount,rw /usr && mount -o remount,exec /var && mount -o remount,exec /tmp";};
Post-Invoke {"mount -o remount,ro /usr ; mount -o remount,noexec /var && mount -o remount,noexec /tmp";};
}
It seems that LibreOffice 4.0 tries to put compiled Python objects into a
persistent cache, and since it resides on a read-only filesystem, it cannot
even create the __pycache__
directories needed for that. My workaround is
the following shell script that needs to be ran just once, and works quite
well by letting LibreOffice put its cached pyc
files into /tmp
.
#!/bin/sh
mount /usr -o rw,remount
find /opt/libreoffice4.0/program/python-core-3.3.0/lib -type d \
-exec ln -s /tmp {}/__pycache__ \;
mount /usr -o ro,remount