Python Can';t导入matplotlib.pyplot,与字体相关的IOError
我最近安装了Python的Anaconda发行版。当我尝试导入matplotlib.pyplot时,字体管理器尝试访问我计算机上的一种字体时,我收到一个“权限被拒绝”错误Python Can';t导入matplotlib.pyplot,与字体相关的IOError,python,matplotlib,fonts,anaconda,Python,Matplotlib,Fonts,Anaconda,我最近安装了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 "licen
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'
Python 2.7.8 | Anaconda 2.1.0(x86_64)|(默认,2014年8月21日,15:21:46)
[GCC 4.2.1(Apple Inc.build 5577)]关于达尔文
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
Anaconda由Continuum Analytics为您带来。
请查收:http://continuum.io/thanks 及https://binstar.org
>>>将matplotlib.pyplot作为plt导入
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/pyplot.py”,第27行,在
导入matplotlib.colorbar
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/colorbar.py”,第34行,在
将matplotlib.collections导入为集合
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/collections.py”,第27行,在
导入matplotlib.backend_base作为后端_base
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/backend_base.py”,第56行,在
将matplotlib.textpath导入为textpath
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/textpath.py”,第19行,在
将matplotlib.font\u管理器导入为font\u管理器
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/font_manager.py”,第1412行,在
_重建()
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/font\u manager.py”,第1397行,在重建中
fontManager=fontManager()
文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/font_manager.py”,第1052行,在__
self.ttflist=createFontList(self.ttffiles)
createFontList中的文件“/Users/lck/anaconda/lib/python2.7/site packages/matplotlib/font_manager.py”,第579行
font=ft2font.ft2font(fpath)
IOError:[Errno 13]权限被拒绝:u'/Library/Fonts/Finale-lystic.ttf'
如何让matplotlib.pyplot加载,而不在出现“权限被拒绝”字体错误时停止?我不需要任何特定的字体(例如,我不需要使用“最终歌词斜体”-任何字体都可以)。任何想法都将不胜感激 这里要做的显而易见的事情是实际解决问题,而不是解决问题。您知道有问题文件的路径;只要
chmod
it
但是如果您需要解决这个问题(例如,您正在将程序部署到许多机器上,其中任何一台都可能有此问题)……那么,如果您仔细看,问题出在font\u manager.createFontList
中。对于非AFM字体,FT2Font
构造函数包装在一个try
中,该构造函数处理RuntimeError
和unicodeeerror
,但不处理IOError
*
你可以说这是matplotlib中的一个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,确保所有依赖项都是最新的,然后从fork的顶层安装pip。
。(如果您已经提交了一个bug,您还应该创建一个pull请求,或者创建一个补丁文件并将其上传到bug报告。)**
如果您想从自己的代码中对其进行monkeypatch,请将整个createFontList
函数复制到代码中,编辑副本,然后在定义后添加matplotlib.font\u manager.createFontList=createFontList
*在本例中,您可以通过修补ft2font.ft2font
来引发RuntimeError
,但这不是Python,因此这将是一个更麻烦的问题
**正如建议的那样,您可以只编辑站点包中的
.py
文件,而不是编辑和重建项目。当然,这只能在一台机器上工作,如果以后需要,很容易忘记解决方法,并且可能需要您了解站点包的工作方式,但是如果所有这些听起来都正常,那么显然工作量要少得多。我在Linux Mint 17.2中也遇到了同样的问题。我在终端中执行此操作:
sudo chmod 644/my字体路径/*
对于您,请尝试:
sudo chmod 644/库/字体/结局/*
更多信息可在此处找到好吧,您可以通过修补
matplotlib
(在磁盘上或monkeypatching它),或通过强制为其构建字体缓存,或其他方式来解决此问题……但只通过chmod
修补字体文件来解决此问题要简单得多。(如果你不知道如何做到这一点,这可能是超级用户的问题,而不是StackOverflow。)如果你真的想解决这个问题,那么可能有人会在这里向你展示如何做到这一点,但这将更加困难和笨拙。他也可以修补他已经拥有的代码,而不是经历所有Github的事情。如果执行导入matplotlib;打印matplotlib.\uuuuu文件\uuuuu
以显示其位置。@user3267581:是;这可能导致必须知道如何查找不同版本的.pyc
文件,查看.egg
/.zip
归档文件,并了解有关文件权限的更多信息,等等。而且,在多台机器上复制也比较困难(即使这仅仅意味着“我现在的机器,以及18个月后我将拥有的新笔记本电脑,当我忘记如何解决它时”)。如果它适用于OP,很好,它可以为他节省一些时间(so+1);但我不想把它写成一个通用的解决方案。谢谢!按照您的建议将except RuntimeError:
更改为except(RuntimeError,IOError):
我不想chmod