trigger font-config errors by making $HOME/.fontconfig
not writable
!ls -la $HOME
!fc-cache
total 36 drwxr-xr-x 1 test root 4096 Aug 6 11:12 . drwxr-xr-x 1 root root 4096 Aug 6 11:12 .. drwxr-xr-x 2 root root 4096 Aug 6 11:12 .cache drwxr-xr-x 2 root root 4096 Aug 6 11:12 .fontconfig drwxr-xr-x 2 test test 4096 Aug 6 11:12 .fonts drwxr-xr-x 3 test test 4096 Aug 6 11:12 .ipython drwxr-xr-x 4 test test 4096 Aug 6 11:12 .jupyter drwxr-xr-x 3 test test 4096 Aug 6 11:12 .local Fontconfig error: No writable cache directories Fontconfig error: No writable cache directories /home/test/.fonts: failed to write cache
importing weasyprint triggers font-config errors:
import weasyprint
Fontconfig error: No writable cache directories
repeated imports don't trigger module load, so no repeated output:
import weasyprint
but we can trigger fcinit again
from weasyprint.text.fonts import fontconfig
fontconfig.FcInitLoadConfigAndFonts();
Fontconfig error: No writable cache directories
(restart kernel)
using wurlitzer.pipes()
suppresses output during import:
import wurlitzer
with wurlitzer.pipes():
import weasyprint
(restart kernel)
importing fontconfig submodule triggers output because import weasyprint
is implied any time a submodule is imported
import sys
from weasyprint.text.fonts import fontconfig
'weasyprint' in sys.modules
Fontconfig error: No writable cache directories
True
import weasyprint
does nothing because it's already been run
import weasyprint
fontconfig.FcInitLoadConfigAndFonts();
Fontconfig error: No writable cache directories
import wurlitzer
with wurlitzer.pipes():
fontconfig.FcInitLoadConfigAndFonts();
(restart kernel)
the example in https://github.com/minrk/wurlitzer/issues/92
import sys
import wurlitzer
from weasyprint.text.fonts import fontconfig
sys.stderr.flush()
print("after import")
with wurlitzer.pipes():
fontconfig.FcInitLoadConfigAndFonts();
Fontconfig error: No writable cache directories
after import
Running a second time produces no output, because the output was produced by the import:
import sys
import wurlitzer
from weasyprint.text.fonts import fontconfig
sys.stderr.flush()
print("after import")
with wurlitzer.pipes():
fontconfig.FcInitLoadConfigAndFonts();
after import
(restart kernel)
same example, also capturing output for the import:
import wurlitzer
with wurlitzer.pipes():
from weasyprint.text.fonts import fontconfig
with wurlitzer.pipes():
fontconfig.FcInitLoadConfigAndFonts();