Mac M2使用Graphviz时提示找不到cairo/libcairo-2求助
解决Mac M2上Graphviz与Cairo依赖报错问题
环境信息
# python3 --version Python 3.11.2 # brew install graphviz // (Cairo etc are installed along) # dot -V dot - graphviz version 8.1.0 (20230707.0739) # which dot /opt/homebrew/bin/dot # echo $PATH | tr : ' ' | fmt -w1 | grep local /usr/local/bin
问题代码(task.ipynb)
graphviz_path = '/opt/homebrew/bin/dot' # graphviz_path = '/usr/local/bin' import os os.environ["PATH"] += os.pathsep + graphviz_path from graphviz import Source from sklearn import tree graph = Source( tree.export_graphviz(dtc_model, out_file=None, feature_names=features.columns)) from cairosvg import svg2png from IPython.display import Image svg2png(bytestring=graph.pipe(format='svg'),write_to='output.png') Image("output.png")
报错详情
--> 1 from cairosvg import svg2png 3 from IPython.display import Image 4 svg2png(bytestring=graph.pipe(format='svg'),write_to='output.png') File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/cairosvg/__init__.py:26 22 VERSION = __version__ = (ROOT / 'VERSION').read_text().strip() 25 # VERSION is used in the "url" module imported by "surface" ---> 26 from . import surface # noqa isort:skip 29 SURFACES = { 30 'PDF': surface.PDFSurface, 31 'PNG': surface.PNGSurface, (...) 34 'SVG': surface.SVGSurface, 35 } 38 def svg2svg(bytestring=None, *, file_obj=None, url=None, dpi=96, 39 parent_width=None, parent_height=None, scale=1, unsafe=False, 40 background_color=None, negate_colors=False, invert_images=False, 41 write_to=None, output_width=None, output_height=None): File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/cairosvg/surface.py:9 6 import copy 7 import io ... no library called "cairo" was found no library called "libcairo-2" was found cannot load library 'libcairo.so.2': dlopen(libcairo.so.2, 0x0002): tried: 'libcairo.so.2' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibcairo.so.2' (no such file), '/usr/lib/libcairo.so.2' (no such file, not in dyld cache), 'libcairo.so.2' (no such file), '/usr/lib/libcairo.so.2' (no such file, not in dyld cache). Additionally, ctypes.util.find_library() did not manage to locate a library called 'libcairo.so.2' cannot load library 'libcairo.2.dylib': dlopen(libcairo.2.dylib, 0x0002): tried: 'libcairo.2.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibcairo.2.dylib' (no such file), '/usr/lib/libcairo.2.dylib' (no such file, not in dyld cache), 'libcairo.2.dylib' (no such file), '/usr/lib/libcairo.2.dylib' (no such file, not in dyld cache). Additionally, ctypes.util.find_library() did not manage to locate a library called 'libcairo.2.dylib' cannot load library 'libcairo-2.dll': dlopen(libcairo-2.dll, 0x0002): tried: 'libcairo-2.dll' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibcairo-2.dll' (no such file), '/usr/lib/libcairo-2.dll' (no such file, not in dyld cache), 'libcairo-2.dll' (no such file), '/usr/lib/libcairo-2.dll' (no such file, not in dyld cache). Additionally, ctypes.util.find_library() did not manage to locate a library called 'libcairo-2.dll'
解决步骤
修正Graphviz路径设置:代码中把
/opt/homebrew/bin/dot加到PATH是错误的,应该添加dot所在的目录/opt/homebrew/bin:graphviz_path = '/opt/homebrew/bin' import os os.environ["PATH"] += os.pathsep + graphviz_path或者直接用graphviz库的方法指定可执行文件路径:
from graphviz import set_executable set_executable('/opt/homebrew/bin/dot')让Python找到Cairo库:Mac M2上brew安装的Cairo在
/opt/homebrew/lib目录,需要告诉Python这个路径:- 在Jupyter Notebook开头添加环境变量设置:
import os os.environ["DYLD_LIBRARY_PATH"] = "/opt/homebrew/lib" + os.pathsep + os.environ.get("DYLD_LIBRARY_PATH", "") - 或者在启动Jupyter前,在终端执行:
export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH
- 在Jupyter Notebook开头添加环境变量设置:
重新安装pycairo(推荐):用brew安装pycairo,自动关联brew版Cairo,避免路径问题:
pip uninstall pycairo brew install pycairo
内容的提问来源于stack exchange,提问作者nabil libre
相关产品推荐
相关产品推荐

