参考的解决方法是:OSError: `pydot` failed to call GraphViz.Please install GraphViz问题解决_sinat_40282753的博客-优快云博客,实际上参考方案只是提供了思路,按照参考方案并未解决。
步骤1:简单处理
1.pip3 install pydot
2.pip3 install graphviz
3.Windows 安装 graphviz-install-2.44.1-win64.exe
4.将安装bin路径添加进环境的Path,如知乎专栏所述。
5.步骤4功能同在代码中添加:
import os
os.environ["PATH"] += os.pathsep + '自己安路径/bin/'
结果:
运行还会出现: Failed to import pydot. You must `pip install pydot` and install graphviz (https://graphviz.gitlab.io/download/), ', 'for `pydotprint` to work.')
步骤2: 安装其他包和更改原代码
第一、尝试pip3 install pydot_ng (不是必须的)
import pydot_ng as pydot
print (pydot.find_graphviz())
可以解决部分问题。如还是报错,用下面方案。
第二、按chutongz大神博客更改pydot.py的代码
结果:
运行还会出现: Failed to import pydot. You must `pip install pydot` and install graphviz (https://graphviz.gitlab.io/download/), ', 'for `pydotprint` to work.')
步骤3: 跟踪源代码
将先前所有更改的代码都进行还原,进行debug看程序在那个地方出现问题,发现:
keras.utils.plot_model初始化的时候
1、keras.utils.vis_utils中初始化话顺序是这样的
try:
# pydot-ng is a fork of pydot that is better maintained.
import pydot_ng as pydot
except ImportError:
# pydotplus is an improved version of pydot
try:
import pydotplus as pydot
except ImportError:
# Fall back on pydot if necessary.
try:
import pydot
except ImportError:
pydot = None
也就是pydot优先绑定pydot_ng,然后pydotplus,最后pydot,因为当前安装了pydot_ng,当前就是pydot_ng
2、pydot.Dot.create(pydot.Dot())调用方法为
当前绑定的pydot_ng,对应的_init_方法中,有如下代码:
p = subprocess.Popen(
cmdline,
cwd=tmp_dir,
stderr=subprocess.PIPE, stdout=subprocess.PIPE)
stderr = p.stderr
stdout = p.stdout
stdout_output = list()
while True:
data = stdout.read()
if not data:
break
stdout_output.append(data)
stdout.close()
debug发现,已经拿到dot.exe的正确位置,最终是因为stdout_output没有数据导致异常,外面的异常统一抛出为:Failed to import pydot. You must `pip install pydot` and install graphviz (https://graphviz.gitlab.io/download/), ', 'for `pydotprint` to work.') 这个异常没说清楚太恶心了,怀疑是dot需要什么配置
3、命令行下
dot -v 啥也没有, -v 的命令解释是:
-v - Enable verbose mode
查找官方,用dot -c配置一下,然后dot -v看下配置信息,如下:
再次运行程序,可以正常的生成深度学习的网络结构图
最终安装成功环境信息:
win7系统,python 3.6.6, pydot_ng版本2.0.0, python中graphviz包是0.15,graphviz的二进制版本2.44.1
2、总结
2.1 注意事项
- pydot优先绑定pydot_ng,然后pydotplus,最后pydot,这个兼容太魔性了,会搞的很混乱,最好直接用pydot_ng
- python中graphviz只是个封装,需要本地安装二进制包
- graphviz的二进制版本2.44.1需要手动配置下,要不验证过程中调用dot生成图片会失败
2.2 正确方法
- pip install pydot_ng
- pip install graphviz
- windows下安装二进制graphviz包,并且加到系统路径中
- cmd命令下,执行dot -c进行配置,并且dot -v验证是否配置成功
- 大功告成