107

当我用 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

4

14 回答 14

220

回答pydot >= 1.1

(upstream) 的不兼容问题pydot已由6dff94b3f1 修复,因此pydot >= 1.1pyparsing >= 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

如果您没有安装pyparsingusing pip,而是使用setup.py了 ,请查看此解决方案以卸载软件包。谢谢@qtips。

于 2013-07-27T22:07:48.033 回答
57

pip repo 中有一个名为 pydot2 的新包,它与 pyparsing2 一起正常工作。我无法降级我的包,因为 matplotlib 依赖于较新的 pyparsing 包。

注意:来自 macports 的 python2.7

于 2014-01-31T20:22:33.910 回答
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:
于 2013-08-31T11:49:44.407 回答
7

我分叉了 pydot 存储库 [1],应用了 Gabi Davar 补丁和一些更改以支持 python-3。该软件包在 PyPI [2] 中可用。

干杯

于 2014-01-30T16:53:53.023 回答
6

$ sudo pip uninstall pydot

$ sudo pip install pydot2

请参阅以下链接:http: //infidea.net/troubleshooting-couldnt-import-dot_parser-loading-of-dot-files-will-not-be-possible/

于 2015-06-29T05:04:32.947 回答
5

解决方案不是从某个地方安装 pydot,而是从官方 ubuntu 存储库安装“python-pydot”。

于 2013-04-11T15:29:29.163 回答
3

现在至少还有两个版本似乎支持 PyParsing-2 和 Python-3:

于 2015-02-17T20:05:12.327 回答
3

我又遇到了问题,我的上述解决方案不起作用。如果这对您来说是正确的,并且您也在使用 El Capitan 的 Mac 上使用 Anaconda,请尝试以下操作:

conda install --channel https://conda.anaconda.org/RMG graphviz`
conda install --channel https://conda.anaconda.org/RMG pydot
于 2016-01-28T02:57:37.537 回答
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'
#
于 2017-09-15T21:23:25.787 回答
2

这对我有用(Mac OS X 10.9 和 Python 2.7.10 在 Anaconda 上):

conda uninstall pydot

然后,

conda install pydot

然后在 pydot 安装后将 Pyparsing 降级(从 2.x 到 1.5.7)。未来的 Google 员工:这让我能够正确安装和导入 Theano。

于 2015-08-10T01:29:17.347 回答
1

在 OSX Mavericks 上,以下方法成功了……我遇到了同样的错误,但在底部也有人抱怨 graphviz 可执行文件不存在……我认为问题是我在其他模块之前安装了 graphviz?

brew uninstall graphviz
brew install graphviz
于 2015-01-14T14:58:09.080 回答
1

当其他解决方案不起作用时,这是解决问题的一种快速而肮脏的方法:

此示例来自 Ubuntu 16.04 上的 python 2.7。

编辑文件 python2.7/site-packages/keras/utils/visualize_util.py 并注释下面的代码段。

if not pydot.find_graphviz():
    raise ImportError('Failed to import pydot. You must install pydot'
                      ' and graphviz for `pydotprint` to work.')

find_graphviz() 在较新版本的 pydot 上是多余的,上面的调用不起作用。

于 2017-02-28T05:25:37.387 回答
1

我也遇到了这个问题,我的 pydot==1.0.28 而 pyparsing==2.2.0. 我通过从谷歌下载最新的 pydot 1.2.3(tar.gz) 解决了这个问题,然后离线安装。当我在 ubuntu 14.04 中更新 pydot 时,它说 pydot 1.0.28 是最新版本。因此我从谷歌下载了 1.2.3 版本。

于 2017-12-24T11:49:33.610 回答
0

您需要将 pyparsing 从 2.x 版本降级到 1.5.7 版本才能使 pydot 正常工作。

对于 win-64,使用 Conda,这对我有用:

conda install -c https://conda.anaconda.org/Trentonoliphant pyparsing=1.5.7

然后我禁用/卸载了 2.x 版本并在我的脚本中重新加载了 pyparsing:

pyparsing = reload(pyparsing)
pydot = reload(pydot)

要检查您是否运行了正确的版本:

print pyparsing.__version__
于 2016-04-14T08:42:19.553 回答