matplotlib braucht Zeit beim Importieren

103

Ich habe gerade ein Upgrade auf die neueste stabile Version von matplotlib(1.5.1) durchgeführt und jedes Mal, wenn ich matplotlib importiere, erhalte ich folgende Meldung:

/usr/local/lib/python2.7/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')

... die immer für ein paar Sekunden stehen bleibt.

Ist das das erwartete Verhalten? War es auch vorher dasselbe, aber nur ohne die gedruckte Nachricht?

Ricky Robinson
quelle
32
relevant: github.com/matplotlib/matplotlib/pull/5640 . Der Vorschlag dort ist, den Inhalt von zu löschen ~/.cache/matplotlibund es erneut zu versuchen. Es kann ein Berechtigungsproblem sein - es sollte nicht jedes Mal diesen Cache
erstellen
Ich hatte die letzten Kommentare nicht gelesen. Vielen Dank!
Ricky Robinson
7
Das hat bei mir funktioniert. Unter Ubuntu 14.04.2 mit Python 2.7 habe ich alle Dateien in ~ / .cache / matplotlib / gelöscht. Zuerst dachte ich, dass es nicht funktioniert, weil ich danach die Warnung bekam. Aber nachdem die Cache-Dateien neu erstellt wurden, verschwand die Warnung. :)
Nancy Poekert
In einer mod_wsgi + apache httpd + centos-Kombination - wenn eine Anfrage vom Browser gesendet wird, wartet der httpd einfach darauf, dass der Schriftcache erstellt wird .... Er wartet mehr als 6 Minuten und geht weiter und weiter .... und wird nie abgeschlossen das Font-Update. Könnten Sie bitte vorschlagen, wie dies gelöst werden kann? Vielen Dank
Vinodh

Antworten:

116

Wie Tom im obigen Kommentar vorgeschlagen hat, löschen Sie die Dateien:

fontList.cache
fontList.py3k.cache 
tex.cache 

das Problem lösen. In meinem Fall waren die Dateien unter:

`~/.matplotlib`

BEARBEITET

Vor ein paar Tagen erschien die Nachricht erneut. Ich habe die Dateien an den oben genannten Orten ohne Erfolg gelöscht. Ich fand, dass, wie hier von T Mudau vorgeschlagen, es einen zusätzlichen Speicherort mit Text-Cache-Dateien gibt:~/.cache/fontconfig

Hugo
quelle
6
Ich bin auf OSX El Capitan und dies löst das Problem nicht. Irgendwelche Gedanken?
mar tin
2
Auf El Capitan musste ich auch ~ / .cache / fontList oder ähnliches entfernen.
Erdnuss_Butter
29
mpl.get_cachedir()zeigt die Cache-Speicherort- Dokumente
Lenna
2
Ich bin auf OS X El Capitan und dies behebt das Problem.
Nr.
6
Beachten Sie, dass Sie nach dem Löschen dieser Dateien immer noch eine Warnung erhalten - beim nächsten Import von matplotlib. Danach bist du fertig.
Ohruunuruus
25

Bestätigter Hugos Ansatz funktioniert für Ubuntu 14.04 LTS / matplotlib 1.5.1:

  • ~ / .cache / matplotlib / fontList.cache gelöscht
  • Code ausgeführt, erneut wurde die Warnung ausgegeben (Annahme: Erstellt den Cache korrekt neu)
  • Code erneut ausgeführt, keine Warnung mehr (endlich)
Bill Gale
quelle
12

Unter OSX Yosemite (Version 10.10.15) hat Folgendes für mich funktioniert:

  • Entfernen Sie auch die Cache-Dateien aus diesem Verzeichnis: ~ / .cache / fontconfig (gemäß Toms Vorschlag)
    rm -rvf ~/.cache/fontconfig/*
  • entfernte auch .cache-Dateien in ~ / .matplotlib (gemäß Hugos Vorschlag)
    rm -rvf ~/.matplotlib/*
robbbyr
quelle
Arbeitete für mich unter macOS X El Captain. Ich habe den Eindruck, dass dadurch auch andere Bibliotheken schneller geladen werden konnten.
SeF
arbeitete unter macOS 10.12. Beim zweiten Laden wird die Nachricht nicht mehr angezeigt.
Demis
9

Ich habe den Python-Code nur einmal mit sudo ausgeführt und die Warnung für mich behoben. Jetzt läuft es schneller. Laufen ohne Sudo gibt überhaupt keine Warnung.

Prost

Awais
quelle
Willkommen bei Stack Overflow! Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Enamul Hassan
Ich verwende Jupyter Notebook unter Mac OS X El Capitan. Ich lief sudo jupyter notebookdann import matplotlib.pyplotin einem Notizbuch und es löste mein Problem.
Kungphil
Ich habe seit Monaten damit zu kämpfen und das hat es gelöst! Ich bin auf OS 10.9.5.
Tactopoda
1
Wenn Sie sich die akzeptierte Antwort ansehen, werden Sie feststellen, dass Sie das Problem nur durch Ändern des Benutzers gelöst haben. Da im Stammverzeichnis keine ~ / .matplotlib vorhanden ist, verschwindet das Problem.
Rsh
@Rsh Nein, die Antworten zur Verwendung von Root-Berechtigungen besagen, dass das einmalige Ausführen als root dazu führt, dass der Cache nicht erneut erstellt wird, wenn Sie danach als regulärer Benutzer ausgeführt werden. Jedenfalls hat das bei mir nicht funktioniert.
Sudo
3

Ich habe den Python-Code w ausgeführt. sudo und es hat es geheilt ... meine Vermutung war, dass es keine Erlaubnis gab, diese Tabelle zu schreiben ... viel Glück!

C at
quelle
0

HI Sie müssen diese Datei finden: font_manager.py in meinem Fall: C: \ Users \ gustavo \ Anaconda3 \ Lib \ site-packages \ matplotlib \ font_manager.py

und FIND def win32InstalledFonts (Verzeichnis = Keine, fontext = 'ttf') und ersetzen durch:

def win32InstalledFonts (directory = None, fontext = 'ttf'): "" Suchen Sie im angegebenen Schriftartenverzeichnis nach Schriftarten oder verwenden Sie die Systemverzeichnisse, wenn keine angegeben sind. Eine Liste der TrueType-Schriftdateinamen wird standardmäßig zurückgegeben, oder AFM-Schriftarten, wenn fontext == 'afm'. "" "

from six.moves import winreg
if directory is None:
    directory = win32FontDirectory()

fontext = get_fontext_synonyms(fontext)

key, items = None, {}
for fontdir in MSFontDirectories:
    try:
        local = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, fontdir)
    except OSError:
        continue

    if not local:
        return list_fonts(directory, fontext)
    try:
        for j in range(winreg.QueryInfoKey(local)[1]):
            try:
                key, direc, any = winreg.EnumValue(local, j)
                if not is_string_like(direc):
                    continue
                if not os.path.dirname(direc):
                    direc = os.path.join(directory, direc)
                    direc = direc.split('\0', 1)[0]

                if os.path.splitext(direc)[1][1:] in fontext:
                    items[direc] = 1
            except EnvironmentError:
                continue
            except WindowsError:
                continue
            except MemoryError:
                continue
        return list(six.iterkeys(items))
    finally:
        winreg.CloseKey(local)
return None
Gus Ch
quelle
0

Dies funktionierte für mich unter Ubuntu 16.04 LST mit Python 3.5.2 | Anaconda 4.2.0 (64-Bit) . Ich habe alle Dateien in gelöscht ~/.cache/matplotlib/.

sudo rm -r fontList.py3k.cache tex.cache 

Zuerst dachte ich, es würde nicht funktionieren, weil ich danach die Warnung bekam. Aber nachdem die Cache-Dateien neu erstellt wurden, verschwand die Warnung. Schließen Sie also Ihre Datei und öffnen Sie sie erneut (erneut öffnen). Es wird keine Warnung angezeigt.

S. Theon
quelle
-1

Das hat bei mir funktioniert:

sudo apt-get install libfreetype6-dev libxft-dev
Mykahveli
quelle