Error de pydot y graphviz: no se pudo importar dot_parser, la carga de archivos dot no será posible

107

Cuando ejecuto un código muy simple con 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')

Me imprime el mensaje de error:

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

Estoy usando python 2.7.3

Sadik
fuente
6
pip install pydot2debería solucionar este problema. Mucho mejor que usarlo pip uninstallporque si comparte código puede agregar pydot2 a su requirements.txt y no dejar que los usuarios ejecuten comandos desconocidos.
RussellStewart

Respuestas:

220

Respuesta por pydot >= 1.1:

La incompatibilidad de (upstream) pydotha sido corregida por 6dff94b3f1 y, por pydot >= 1.1lo tanto , será compatible conpyparsing >= 1.5.7 .


Respuesta aplicable a pydot <= 1.0.28:

Para cualquier otra persona que se encuentre con esto, se debe a los cambios en pyparsing de 1.xa la versión 2.x. Para instalar pydot usando pip, primero instale la versión anterior de pyparsing:

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

Si no lo instaló pyparsingusando pip, sino que lo usó setup.py, eche un vistazo a esta solución para desinstalar el paquete. Gracias @qtips.

Jonathan
fuente
1
Instalé NetworkX, GraphViz y pydot, pero no pude conseguir que la funcionalidad Graphviz funcionara con NetworkX (por ejemplo, este ejemplo de NetworkX falló). Seguí obteniendo: el nombre global 'dot_parser' no está definido . Tu solución resolvió este problema.
qtips
1
Además, sudo pip uninstallno funciona si ha instalado su paquete usando python setup.py installen ese caso, siga esta solución. Este fue al menos el caso en mi Mac Mountain Lion OSX
qtips
sudoobviamente no siempre es necesario, como si estuviera usando un virtualenv. Aparte de eso, ¡esto funcionó para mí!
David Reynolds
En Ubuntu 12.04 obtengo este error, al instalar analizando: "Solicitud de pyparsing == 1.5.7, pero instalando la versión 2.0.1". Entonces, el error anterior todavía ocurre Así que la solución fue especificar la ubicación de descarga del huevo de Python: sudo pip install -Iv pypi.python.org/packages/source/p/pyparsing/…
lefterav
45
¿Por qué no simplemente pip install pyparsing==1.5.7?
Suor
57

Hay un nuevo paquete en el repositorio pip llamado pydot2 que funciona correctamente con pyparsing2. No pude degradar mis paquetes porque matplotlib depende del paquete pyparsing más nuevo.

Nota: python2.7 de macports

Dana la cuerda
fuente
7
En mi humilde opinión, esta respuesta debe considerarse sobre la idea de degradación de pyparsing. También me funciona perfectamente con networkx. Gracias !
Raghav RV
Sigue dando este error pero el error dot_parser desapareció. Debe instalar pydot para pydotprintque funcione.
Inanc Gumus
21

pydot usó una variable de módulo privada (_noncomma) de pyparsing. La siguiente diferencia lo corrige para usarlo en 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:
Gabi Davar
fuente
2
Solo para completar, aquí está el informe de problemas de pydot que informa este problema y la solución mencionada por @Gabi Davar.
Jack Kelly
7

Bifurqué el repositorio de pydot [1], apliqué el parche de Gabi Davar y algunos cambios para admitir python-3. El paquete está disponible en PyPI [2].

Salud

David Villa
fuente
1
La página de PyPI parece estar inactiva. ¡Eso es muy malo! ¿Alguna idea de por qué?
Dav Clark
el paquete de pip parece estar roto. pip install...falló en el medio sin error explícito. Parece que el manifiesto y los archivos reales no coinciden. Reviso el repositorio de git y mv README.rst READMEluego python setup.py install. Esto funcionó para mí :-)
Kenji Noguchi
2
el enlace, pypi.python.org/pypi/pydot2 , está roto pero pip install pydot2funciona y este enlace, pypi.python.org/pypi/pydot2/1.0.32 , funciona.
Mark Mikofski
5

La solución no fue instalar pydot desde algún lugar, sino "python-pydot" desde los repositorios oficiales de ubuntu.

Sadik
fuente
A partir del 25 de agosto de 2013 pip install python-pydotno me funciona (no se encontró la distribución); pip install pydothace. Así que no creo que pydotsea ​​necesariamente extraoficial. ¿Quizás estaba instalando a través de una distribución de sistema operativo?
Owen S.
5
No con pip, lo sudo apt-get install python-pydothice por mí.
Sadik
Eso probablemente funcionaría porque Ubuntu tiene actualmente python-pyparsingen 1.5.2, lo que evita la incompatibilidad de versiones mencionada anteriormente. Fui con la solución anterior y no he tenido problemas desde entonces. ¡Gracias!
Owen S.
1
Desafortunadamente, en Ubuntu a partir de Saucy, el pyparsing se ha actualizado, pero pydot no se ha parcheado adecuadamente.
Tully
1
Presenté
Tully
3

Ahora hay al menos 2 versiones más que parecen ser compatibles con PyParsing-2 y Python-3:

  • PyDotPlus de Carlos Jenkins con un simpático robot de compilación de Travis y documentación sofisticada . Sin embargo, deberá cambiar el nombre de la carpeta de site-packages\pydotplusa site-packages\pydotpara que funcione con los programas existentes que importan pydot.
  • pydot3k por bmcorser . Lamentablemente, ¡no funcionó!
  • prologic / pydot de James Mills vinculado desde la página oficial de códigos de Google pydot como ...

    una rama para la compatibilidad con Python 3

  • y aquí hay un enlace de trabajo al pydot2 de David Villa que funciona bien: https://pypi.python.org/pypi/pydot2/1.0.32

Mark Mikofski
fuente
3

Tuve el problema nuevamente y mi solución anterior no funcionó. Si eso es cierto para usted y también está usando Anaconda en una Mac con El Capitan, intente esto:

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

Lo que hice al final después de tantos intentos de lo que vi aquí (pseudo secuencia para que funcione para 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
fuente
2

Esto funcionó para mí (Mac OS X 10.9 con Python 2.7.10 en Anaconda):

conda uninstall pydot

Luego,

conda install pydot

Pyparsing luego se degrada (de 2.xa 1.5.7) tras la instalación de pydot. Futuros Googlers: esto me permitió instalar e importar Theano correctamente.

Scottlittle
fuente
1

En OSX Mavericks lo siguiente funcionó ... Obtuve el mismo error pero en la parte inferior también había una queja de que el ejecutable graphviz no estaba presente ... Creo que el problema fue que había instalado Graphviz antes que los otros módulos.

brew uninstall graphviz
brew install graphviz
ecordo
fuente
1

Cuando otras soluciones no funcionan, este es un método rápido y sucio para resolver el problema:

Este ejemplo es de python 2.7 en Ubuntu 16.04.

Edite el archivo python2.7 / site-packages / keras / utils / visualize_util.py y comente el segmento de código a continuación.

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

find_graphviz () es redundante en las versiones más recientes de pydot y la llamada anterior no funciona.

Totoro
fuente
1

También encontré el problema y mi pydot == 1.0.28 mientras pyparsing == 2.2.0. Solucioné el problema descargando el último pydot 1.2.3 (tar.gz) de Google y luego lo instalé sin conexión. Cuando actualicé pydot en ubuntu 14.04, decía que pydot 1.0.28 es la versión más nueva. Por eso descargo de google la versión 1.2.3.

Cna
fuente
0

Necesita degradar pyparsing de la versión 2.xa la versión 1.5.7 para que pydot funcione correctamente.

Para win-64, usando Conda, esto funcionó para mí:

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

Luego deshabilité / desinstalé la versión 2.xy recargué pyparsing en mi script:

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

Para comprobar si tiene la versión correcta en ejecución:

print pyparsing.__version__
Sander van den Oord
fuente