pydot和graphviz错误:无法导入dot_parser,将无法加载dot文件。

106
当我使用pydot运行一个非常简单的代码时
import pydot
graph = pydot.Dot(graph_type='graph')

for i in range(3):

  edge = pydot.Edge("king", "lord%d" % i)
  graph.add_edge(edge)

vassal_num = 0
for i in range(3):
  for j in range(2):
    edge = pydot.Edge("lord%d" % i, "vassal%d" % vassal_num)
    graph.add_edge(edge)
    vassal_num += 1

graph.write_png('example1_graph.png')

它向我输出了错误信息:
Couldn't import dot_parser, loading of dot files will not be possible.

我正在使用 Python 2.7.3。


6
“pip install pydot2” 可以解决这个问题。相较于使用“pip uninstall”,更加方便,如果你分享代码,只需将pydot2添加到requirements.txt中即可,而不需要让用户运行陌生的命令。 - RussellStewart
14个回答

219

对于pydot >= 1.1的问题已经被修复,具体信息请参考6dff94b3f1。因此,pydot >= 1.1将与pyparsing >= 1.5.7兼容。


对于pydot <= 1.0.28的问题:

如果您遇到了这个问题,那是由于pyparsing从1.x版本到2.x版本的变化导致的。要使用pip安装pydot,请先安装旧版本的pyparsing:

pip install pyparsing==1.5.7
pip install pydot==1.0.28

如果您没有使用pip安装pyparsing,而是使用了setup.py,那么请查看这个解决方案以卸载该软件包。感谢@qtips。


1
我安装了NetworkX、GraphViz和pydot,但无法让Graphviz功能与NetworkX一起使用(例如,此NetworkX示例失败)。我一直收到以下错误信息:全局名称“dot_parser”未定义。您的解决方案解决了这个问题。 - qtips
1
另外,如果您使用 python setup.py install 安装了软件包,则 sudo pip uninstall 无法正常工作。在这种情况下,请按照此解决方案进行操作。至少在我的 Mountain Lion OSX Mac 上是这种情况。 - qtips
“sudo” 显然并不总是必需的,例如如果您正在使用 virtualenv。 除此之外,这对我很有效! - David Reynolds
在Ubuntu 12.04中,当通过解析安装时,我遇到了这个错误:“请求pyparsing==1.5.7,但安装版本2.0.1”。然后仍然出现上述错误。因此,解决方案是指定Python egg的下载位置:sudo pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709 - lefterav
45
为什么不直接使用pip install pyparsing==1.5.7 - Suor
显示剩余5条评论

57

pip仓库中有一个新的包叫做pydot2,可以正确地与pyparsing2配合使用。由于matplotlib依赖于更新的pyparsing包,我无法降级我的软件包。

注意:来自macports的python2.7


7
在我看来,这个回答应该优先考虑,而不是采用将pyparsing版本降级的想法。对于我来说,在networkx中完美地运作。谢谢! - Raghav RV
仍然出现此错误,但是已经解决了dot_parser的错误。你必须安装pydot才能使pydotprint正常工作。 - Inanc Gumus

20

pydot使用了pyparsing中的一个私有模块变量(_noncomma)。以下差异修复了它以在pyparsing 2.0.1中使用:

diff --git a/dot_parser.py b/dot_parser.py
index dedd61a..138d152 100644
--- a/dot_parser.py
+++ b/dot_parser.py
@@ -25,8 +25,9 @@ from pyparsing import __version__ as pyparsing_version
 from pyparsing import ( nestedExpr, Literal, CaselessLiteral, Word, Upcase, OneOrMore, ZeroOrMore,
     Forward, NotAny, delimitedList, oneOf, Group, Optional, Combine, alphas, nums,
     restOfLine, cStyleComment, nums, alphanums, printables, empty, quotedString,
-    ParseException, ParseResults, CharsNotIn, _noncomma, dblQuotedString, QuotedString, ParserElement )
+    ParseException, ParseResults, CharsNotIn, dblQuotedString, QuotedString, ParserElement )

+_noncomma = "".join( [ c for c in printables if c != "," ] )

 class P_AttrList:

2
仅为完整起见,这是关于pydot的问题报告,其中报告了此问题和@Gabi Davar提到的修复方法。 - Jack Kelly

7

1
PyPI页面似乎已经崩溃了,太糟糕了!有任何想法是为什么吗? - Dav Clark
pip包似乎出了问题。pip install...在中途失败,没有明确的错误提示。看起来清单和实际文件不匹配。我检出了git仓库,然后运行mv README.rst README,接着运行python setup.py install。这对我有效 :-) - Kenji Noguchi
2
链接 https://pypi.python.org/pypi/pydot2 已失效,但 pip install pydot2 可以使用,而这个链接 https://pypi.python.org/pypi/pydot2/1.0.32 是有效的。 - Mark Mikofski

6

我执行了相反的操作pip uninstall pydot2,然后执行pip install pydot来修复错误。这里是正确答案的链接: https://github.com/pydot/pydot/issues/166#issuecomment-356066120 - FooBar167

5
解决方案不是从某个地方安装pydot,而是从官方Ubuntu仓库安装“python-pydot”。

截至2013年8月25日,pip install python-pydot对我来说无法工作(找不到分发包);而pip install pydot可以。因此,我认为pydot不一定是非官方的。也许你是通过操作系统分发安装的? - Owen S.
5
不需要使用pip,我使用了“sudo apt-get install python-pydot”命令。 - Sadık
这可能有效,因为Ubuntu目前有1.5.2版本的python-pyparsing,避免了上述的版本不兼容问题。我采用了上述修复方法,自那以后就没有出现问题了。谢谢! - Owen S.
1
很不幸,在Ubuntu Saucy版本中,pyparsing已经升级,但是pydot没有得到适当的修补。 - Tully
1
我已经提交了一个工单来修复Ubuntu软件包:https://bugs.launchpad.net/ubuntu/+source/pydot/+bug/1321135 - Tully
我遇到了“GraphViz的可执行文件未找到”的错误,并尝试了各种方法(尝试为grarphviz设置路径,卸载/安装pyparser、pydot),但在我的Ubuntu precise上,这是唯一有效的方法:sudo apt-get install python-pydot,谢谢! - naoko

3

在尝试了很多次后,根据我在这里所看到的内容(针对networkx),最终我做了什么(伪代码序列):

apt-get remove python-pydot
pip install pydotplus
apt-get install libcgraph6
apt-get install python-pygraphviz


# pip freeze | grep pydot
 pydotplus==2.0.2
# pip freeze | grep pyparsing
pyparsing==2.2.0
# pip freeze | grep graphviz
pygraphviz==1.2
# python -c 'import pydotplus'
#

3

我再次遇到了这个问题,我的上述解决方案并没有起作用。如果你也是在Mac的El Capitan上使用Anaconda,并且遇到同样的问题,请尝试以下方法:

conda install --channel https://conda.anaconda.org/RMG graphviz`
conda install --channel https://conda.anaconda.org/RMG pydot

3
现在至少有两个版本支持PyParsing-2和Python-3:
  • PyDotPlus,由Carlos Jenkins制作,拥有一个不错的travis buildbot和漂亮的文档。但是你需要将它的文件夹名从site-packages\pydotplus改为site-packages\pydot才能使其与导入pydot的现有程序一起工作。
  • pydot3k,由bmcorser制作。遗憾的是,它不能工作!
  • prologic/pydot,由James Mills制作,链接自官方pydot Google代码页面,作为...
    Python 3兼容的分支
  • 这里是David Villa的pydot2的正常工作链接:https://pypi.python.org/pypi/pydot2/1.0.32

2

这对我有用(在Mac OS X 10.9上,使用Anaconda中的Python 2.7.10):

conda uninstall pydot

那么,

conda install pydot

在安装pydot时,Pyparsing会被降级(从2.x降至1.5.7)。未来的读者:这使得我能够正确地安装和导入Theano。


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