Matplotlib导入时花费时间。

105

我刚刚升级到最新版本的matplotlib(1.5.1),但每次我导入matplotlib时都会收到以下消息:

/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.')

......这总是会停顿几秒钟。

这是预期行为吗?在打印消息之前也是这样吗?


32
相关链接:https://github.com/matplotlib/matplotlib/pull/5640。建议是删除`~/.cache/matplotlib`文件夹中的内容,然后再尝试。可能是因为权限问题 - 每次都不应该重新构建缓存。 - tmdavison
我还没有看最新的评论。谢谢! - Ricky Robinson
7
这对我很有用。在Ubuntu 14.04.2上,使用Python 2.7,我删除了~/.cache/matplotlib/中的所有文件。起初我以为没有生效,因为之后还是收到了警告。但是在缓存文件重建后,警告消失了。 :) - Nancy Poekert
在 mod_wsgi+apache httpd+centos 的组合中,当浏览器发送请求时,httpd 会简单地等待并显示正在构建字体缓存...它会等待超过6分钟,而且一直持续下去...并且永远无法完成字体更新。请问您能否提供解决方法?谢谢。 - Vinodh
8个回答

117
如Tom在上面的评论中建议的那样,删除文件:
fontList.cache
fontList.py3k.cache 
tex.cache 

解决问题。 在我的情况下,文件位于:

`~/.matplotlib`

几天前,这条信息再次出现了,我尝试删除上述位置中的文件但没有成功。根据这里T Mudau建议,还有一个额外的包含文本缓存文件的位置是:~/.cache/fontconfig


6
我使用的是OSX El Capitan,但这并没有解决问题。你有什么想法? - mar tin
2
在El Capitan上,我还必须删除~/.cache/fontList或类似的文件。 - peanut_butter
31
mpl.get_cachedir()会显示缓存位置文档 - Lenna
我也在OS X El Capitan上。我注意到第一次删除缓存文件后导入matplotlib.pyplot时,我仍然遇到了相同的错误,但第二次运行速度快得多。 - Steven C. Howell
2
我正在使用OS X El Capitan,这解决了问题。 - nos
6
请注意,在删除这些文件后,您仍将再次收到警告——在下次导入Matplotlib时。之后,一切都已设置完成。 - mattsilver

25

确认Hugo的方法适用于Ubuntu 14.04 LTS/matplotlib 1.5.1:

  • 删除~/.cache/matplotlib/fontList.cache
  • 再次运行代码,警告已发出(假设:正在正确重建缓存)
  • 再次运行代码,不再出现警告(终于)

12
在OSX Yosemite(版本10.10.15)上,以下方法适用于我:
  • 同样地,从此目录中删除缓存文件:~/.cache/fontconfig(根据Tom的建议)
    rm -rvf ~/.cache/fontconfig/*
  • 还删除了 ~/.matplotlib 中的.cache文件(按照Hugo的建议)
    rm -rvf ~/.matplotlib/*

在我的macOS X El Captain上运行良好。我有这样的印象,它也加快了其他库的加载速度。 - SeF
在macOS 10.12上工作。第二次加载时,不再收到消息。 - Demis

9

我只用sudo运行了一次Python代码,它为我解决了警告。现在它运行得更快了。不使用sudo完全没有警告。

干杯


欢迎来到Stack Overflow!虽然这理论上可以回答问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Enamul Hassan
我正在Mac OSX El Capitan上运行Jupyter笔记本。我在notebook中运行了sudo jupyter notebook,然后运行了import matplotlib.pyplot,这解决了我的问题。 - kungphil
我已经苦苦挣扎了几个月,这解决了我的问题!我使用的是OS 10.9.5。 - user2821
1
如果您查看已接受的答案,您会发现您所做的一切就是通过更改用户来解决问题,因为在根目录中没有~/.matplotlib,问题就消失了。 - Rsh
@Rsh 不,建议使用 root 权限的回答是说,以 root 身份运行一次可以避免在以普通用户身份运行后再次构建缓存。无论如何,这对我没有起作用。 - sudo

4

我使用sudo运行了Python代码并解决了问题...我的猜测是没有写入该表的权限...祝你好运!


0

你需要找到这个文件:font_manager.py,我的情况是:C:\Users\gustavo\Anaconda3\Lib\site-packages\matplotlib\ font_manager.py

然后找到 def win32InstalledFonts(directory=None, fontext='ttf') 并替换为:

def win32InstalledFonts(directory=None, fontext='ttf'): """ 在指定的字体目录中搜索字体,如果没有给出,则使用系统目录。默认情况下返回TrueType字体文件名列表,如果fontext == 'afm',则返回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

0

这对我在Ubuntu16.04 LST上使用Python 3.5.2 | Anaconda 4.2.0 (64-bit)有效。我删除了~/.cache/matplotlib/中的所有文件。

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

起初我以为它不会起作用,因为我之后收到了警告。但是在缓存文件重建后,警告消失了。所以,关闭你的文件,重新打开它,就没有警告了。

-1
这对我有用:
sudo apt-get install libfreetype6-dev libxft-dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接