Erro de pydot e graphviz: Não foi possível importar dot_parser, o carregamento de arquivos dot não será possível

107

Quando executo um código muito simples com o 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')

Ele me imprime a mensagem de erro:

Couldn't import dot_parser, loading of dot files will not be possible.

Estou usando o python 2.7.3

Sadik
fonte
6
pip install pydot2deve corrigir esse problema. Muito melhor do que usar, pip uninstallporque se você compartilhar código, você pode apenas adicionar pydot2 ao seu requirements.txt e não permitir que os usuários executem comandos desconhecidos.
RussellStewart

Respostas:

220

Resposta para pydot >= 1.1:

A incompatibilidade de (upstream) pydotfoi corrigida por 6dff94b3f1 e, portanto pydot >= 1.1, será compatível compyparsing >= 1.5.7 .


Resposta aplicável a pydot <= 1.0.28:

Para qualquer outra pessoa que se deparar com isso, é devido às mudanças em pyparsing 1.x para a versão 2.x. Para instalar o pydot usando pip, primeiro instale a versão mais antiga do pyparsing:

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

Se você não instalou pyparsingusando pip, mas em vez disso usou setup.py, dê uma olhada nesta solução para desinstalar o pacote. Obrigado @qtips.

Jonathan
fonte
1
Instalei NetworkX, GraphViz e pydot, mas não consegui fazer com que a funcionalidade Graphviz funcionasse com NetworkX (por exemplo, este exemplo NetworkX falhou). Continuei recebendo: o nome global 'dot_parser' não está definido . Sua solução resolveu este problema.
qtips
1
Além disso, sudo pip uninstallnão funciona se você instalou seu pacote usando python setup.py install, nesse caso, siga esta solução. Este foi pelo menos o caso no meu Mountain Lion OSX Mac
qtips
sudoobviamente, nem sempre é necessário, como se você estiver usando um virtualenv. Fora isso, funcionou para mim!
David Reynolds de
No Ubuntu 12.04, recebo este erro, ao instalar por análise: "Pyparsing solicitado == 1.5.7, mas instalando a versão 2.0.1". O erro acima ainda ocorre. Então, a solução foi especificar o local de download do ovo do python: sudo pip install -Iv pypi.python.org/packages/source/p/pyparsing/…
lefterav
45
Por que não apenas pip install pyparsing==1.5.7?
Suor
57

Há um novo pacote no repositório pip chamado pydot2 que funciona corretamente com pyparsing2. Não consegui fazer o downgrade de meus pacotes porque o matplotlib depende do pacote de análise mais recente.

Nota: python2.7 de macports

Dana the Sane
fonte
7
IMHO Esta resposta deve ser considerada sobre a idéia de desclassificação pyparsing. Funciona perfeitamente para mim com o networkx também. Obrigado !
Raghav RV
Ainda dando esse erro, mas o erro dot_parser desapareceu. Você deve instalar o pydot para pydotprintfuncionar.
Inanc Gumus
21

pydot usou uma variável de módulo privada (_noncomma) de pyparsing. O diff a seguir corrige-o para usar na análise de dados 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:
Gabi Davar
fonte
2
Apenas para completar, aqui está o relatório de problemas para pydot, que relata esse problema e a correção mencionada por @Gabi Davar.
Jack Kelly,
7

Eu fiz um fork do repositório pydot [1], apliquei o patch Gabi Davar e algumas mudanças para suportar o python-3. O pacote está disponível no PyPI [2].

Felicidades

David Villa
fonte
1
A página PyPI parece estar inativa. Isso é ruim! Alguma ideia por quê?
Dav Clark
o pacote pip parece estar quebrado. pip install...falhou no meio sem erro explícito. Parece que o manifesto e os arquivos reais não correspondem. Eu verifico o repositório git e mv README.rst READMEentão python setup.py install. Isso funcionou para mim :-)
Kenji Noguchi
2
o link, pypi.python.org/pypi/pydot2 , está quebrado, mas pip install pydot2funciona e este link, pypi.python.org/pypi/pydot2/1.0.32 , funciona.
Mark Mikofski
5

A solução não foi instalar o pydot de algum lugar, mas "python-pydot" dos repositórios ubuntu oficiais.

Sadik
fonte
A partir de 25 de agosto de 2013 pip install python-pydotnão funciona para mim (distribuição não encontrada); pip install pydotfaz. Portanto, não acho que pydotseja necessariamente não oficial. Talvez você esteja instalando através de uma distribuição de sistema operacional em vez disso?
Owen S.
5
Não com pip, sudo apt-get install python-pydotfez por mim.
Sadik
Isso provavelmente funcionaria porque o Ubuntu atualmente tem python-pyparsing1.5.2, o que evita a incompatibilidade de versão listada acima. Fiz a correção acima e não tive problemas desde então. Obrigado!
Owen S.
1
Infelizmente, no Ubuntu, a partir de Saucy, o pyparsing foi atualizado, mas o pydot não foi corrigido de forma adequada.
Tully
1
Eu preenchi um tíquete para consertar o pacote do Ubuntu: bugs.launchpad.net/ubuntu/+source/pydot/+bug/1321135
Tully
3

Existem agora pelo menos mais 2 versões que parecem ser compatíveis com PyParsing-2 e Python-3:

  • PyDotPlus por Carlos Jenkins com um bom buildbot travis e documentação sofisticada . No entanto, você precisará alterar o nome da pasta de site-packages\pydotpluspara site-packages\pydotpara que funcione com os programas existentes que importam o pydot.
  • pydot3k por bmcorser . Infelizmente, não funcionou!
  • prologic / pydot de James Mills com link na página de código oficial do Google pydot como ...

    uma ramificação para compatibilidade com Python 3

  • e aqui está um link funcional para o pydot2 de David Villa que funciona bem: https://pypi.python.org/pypi/pydot2/1.0.32

Mark Mikofski
fonte
3

Tive o problema novamente e minha solução acima não funcionou. Se isso for verdade para você e você também estiver usando o Anaconda em um Mac com El Capitan, tente o seguinte:

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

O que fiz no final depois de tantas tentativas do que vi aqui (pseudo sequência para funcionar para o 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'
#
Sten
fonte
2

Isso funcionou para mim (Mac OS X 10.9 com Python 2.7.10 no Anaconda):

conda uninstall pydot

Então,

conda install pydot

O pyparsing é então rebaixado (de 2.x para 1.5.7) na instalação do pydot. Googlers do futuro: isso me permitiu instalar e importar o Theano corretamente.

Scotlittle
fonte
1

No OSX Mavericks, o seguinte fez o truque ... Recebi o mesmo erro, mas na parte inferior também havia uma reclamação de que o executável do graphviz não estava presente ... Acho que o problema é que eu tinha instalado o Graphviz antes dos outros módulos?

brew uninstall graphviz
brew install graphviz
ecordo
fonte
1

Quando outras soluções não funcionam, este é um método rápido e sujo para resolver o problema:

Este exemplo é do python 2.7 no Ubuntu 16.04.

Edite o arquivo python2.7 / site-packages / keras / utils / visualize_util.py e comente o segmento de código abaixo.

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

find_graphviz () é redundante em versões mais novas do pydot, e a chamada acima não funciona.

Totoro
fonte
1

Eu também encontrei o problema e meu pydot == 1.0.28 enquanto pyparsing == 2.2.0. Corrigi o problema baixando o pydot 1.2.3 (tar.gz) mais recente do google e instalando-o offline. Quando eu atualizei o pydot no ubuntu 14.04, ele disse que o pydot 1.0.28 é a versão mais recente. Portanto, eu baixei do google a versão 1.2.3.

Cna
fonte
0

Você precisa fazer o downgrade do pyparsing da versão 2.x para a versão 1.5.7 para que o pydot funcione corretamente.

Para win-64, usando Conda, funcionou para mim:

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

Em seguida, desativei / desinstalei a versão 2.x e recarreguei o pyparsing no meu script:

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

Para verificar se você tem a versão correta em execução:

print pyparsing.__version__
Sander van den Oord
fonte