无法导入matplotlib.pyplot,IOError与字体有关

3

我最近安装了Python的Anaconda发行版。当我尝试导入matplotlib.pyplot时,字体管理器试图访问我的计算机上的某个字体时,会收到“权限被拒绝”的错误提示。

Python 2.7.8 |Anaconda 2.1.0 (x86_64)| (default, Aug 21 2014, 15:21:46) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org

>>> import matplotlib.pyplot as plt
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 27, in <module>
import matplotlib.colorbar
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/colorbar.py", line 34, in <module>
import matplotlib.collections as collections
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/collections.py", line 27, in <module>
import matplotlib.backend_bases as backend_bases
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 56, in <module>
import matplotlib.textpath as textpath
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/textpath.py", line 19, in <module>
import matplotlib.font_manager as font_manager
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py", line 1412, in <module>
_rebuild()
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py", line 1397, in _rebuild
fontManager = FontManager()
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py", line 1052, in __init__
self.ttflist = createFontList(self.ttffiles)
File "/Users/lck/anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py", line 579, in createFontList
font = ft2font.FT2Font(fpath)
IOError: [Errno 13] Permission denied: u'/Library/Fonts/Finale Lyrics Italic.ttf'

我该如何让matplotlib.pyplot正常加载,而不停留在“Permission denied”字体错误上?我不需要任何特定的字体(例如,我不需要使用“Finale Lyrics Italics” - 任何字体都可以)。非常感谢您的任何想法!


你可以通过修补matplotlib(在磁盘上或者monkeypatching)来解决问题,或者强制为其构建字体缓存,或者其他方式……但是,通过chmod字体文件的权限来解决问题会更简单。如果你不知道如何操作,那可能需要去SuperUser问一下,而不是StackOverflow。如果你真的想绕过它,那么有人可能会在这里向你展示如何操作,但这将更加困难和笨重。 - abarnert
2个回答

4
我在Linux Mint 17.2中遇到了同样的问题。我在终端中执行以下命令: sudo chmod 644 /my-fonts-path/* 对于您,可以尝试执行以下命令: sudo chmod 644 /Library/Fonts/Finale/* 更多信息可以在这里找到:http://ubuntuforums.org/showthread.php?t=1976037

2
这里显然应该的做法是实际修复问题,而不是绕过它。你知道有问题的文件路径;只需使用chmod命令进行更改。
但如果你需要绕过它(例如,你要将程序部署到许多机器上,其中任何一台都可能存在此问题)……嗯,如果你查看源代码,问题就在于font_manager.createFontList中。对于非AFM字体,FT2Font构造函数被包装在一个try块中,处理RuntimeErrorUnicodeError,但没有处理IOError。*
你可以认为这是matplotlib的一个bug。我不确定,但如果你认为是这样,请报告一个bug在邮件列表中发布
无论哪种方式,你都需要一个修复程序,无论是只在本地使用还是提交到上游。这个补丁很简单,在那个函数中,只需更改以下内容:
try:
    font = ft2font.FT2Font(fpath)
except RuntimeError:
    verbose.report("Could not open font file %s"%fpath)
    continue

"...到:"
try:
    font = ft2font.FT2Font(fpath)
except (RuntimeError, IOError):
    verbose.report("Could not open font file %s"%fpath)
    continue

所以,有两种方法可以做到这一点。
如果您想要补丁您的matplotlib副本,请在Github上fork该存储库,创建一个分支,编辑文件副本,提交到您的分支,确保您拥有所有最新的依赖项,并从您的分支顶层使用pip install .或者直接从git安装。(如果您已经提交了错误报告,您还应该创建一个pull请求,或者创建一个补丁文件并将其上传到错误报告中。)
如果您想从自己的代码中进行monkeypatch,请复制整个createFontList函数到您的代码中,编辑副本,然后在定义之后添加matplotlib.font_manager.createFontList = createFontList
* 你可以选择在这种情况下修补ft2font.FT2Font,使其引发RuntimeError,但那是用C实现的,而不是Python,所以这会更加麻烦。
** 如user3267581所建议的,您可以直接编辑站点包中的.py文件,而无需编辑和重建项目。当然,这只适用于一台机器,在以后需要时很容易忘记解决方法,并且可能需要您了解有关站点包的工作原理的知识,但如果所有这些都听起来还不错,那显然要少得多。

1
他也可以修补他已经有的代码,而不是通过所有的Github事情。如果你想找到它在哪里,可以使用import matplotlib; print matplotlib.__file__ - spalac24
1
@user3267581:是的,这可能会导致需要知道如何找到不同版本的.pyc文件并查看.egg/.zip归档文件,并了解更多关于文件权限等方面的知识。此外,即使只是在多台机器上重现(即“我当前的机器和18个月后我忘记如何解决它时的新笔记本电脑”),也更难。如果适用于OP,那很好,可以节省他一些时间(所以+1);但我不想将其编写为通用解决方案。 - abarnert
1
谢谢!按照您的建议,将 except RuntimeError: 更改为 except (RuntimeError, IOError): ,我的问题立即得到了解决。我不想 chmod 那个字体文件(即使这是比解决方法更好的修复方式),因为我怀疑还将有许多其他单个字体文件需要更改其权限。 (评论按钮建议我不要写简单的评论,比如“谢谢!”,但我非常感激您的帮助。) - LCK

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