Błąd pydot i graphviz: nie można zaimportować dot_parser, ładowanie plików dot nie będzie możliwe

107

Kiedy uruchamiam bardzo prosty kod za pomocą 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')

Wyświetla mi komunikat o błędzie:

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

Używam Pythona 2.7.3

Sadik
źródło
6
pip install pydot2powinien rozwiązać ten problem. O wiele przyjemniejsze niż używanie, pip uninstallponieważ jeśli udostępniasz kod, możesz po prostu dodać pydot2 do swojego Requirements.txt i nie pozwalać użytkownikom na uruchamianie nieznanych poleceń.
RussellStewart

Odpowiedzi:

220

Odpowiedź na pydot >= 1.1:

Niekompatybilność (upstream) pydotzostała naprawiona przez 6dff94b3f1 , a zatem pydot >= 1.1będzie kompatybilna zpyparsing >= 1.5.7 .


Odpowiedź dotyczy pydot <= 1.0.28:

Dla każdego, kto się z tym spotka, wynika to ze zmian w pyparsingu z wersji 1.x do wersji 2.x. Aby zainstalować pydot przy użyciu pip, najpierw zainstaluj starszą wersję pyparsing:

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

Jeśli nie zainstalowałeś pyparsingprzy użyciu pip, ale zamiast tego użyłeś setup.py, spójrz na to rozwiązanie, aby odinstalować pakiet. Dzięki @qtips.

Jonathan
źródło
1
Zainstalowałem NetworkX, GraphViz i pydot, ale nie mogłem zmusić funkcji Graphviz do pracy z NetworkX (np. Ten przykład NetworkX zawiódł). Ciągle otrzymuję: nazwa globalna „dot_parser” nie jest zdefiniowana . Twoje rozwiązanie rozwiązało ten problem.
qtips
1
również sudo pip uninstallnie działa, jeśli zainstalowałeś pakiet przy użyciu python setup.py installw takim przypadku, postępuj zgodnie z tym rozwiązaniem. Tak było przynajmniej na moim Macintoshu z Mountain Lion OSX
qtips
sudooczywiście nie zawsze jest konieczne, jak w przypadku korzystania z virtualenv. Poza tym to zadziałało dla mnie!
David Reynolds
W Ubuntu 12.04 pojawia się ten błąd podczas instalacji byparsing: „Żądane pyparsing == 1.5.7, ale instaluję wersję 2.0.1”. Następnie powyższy błąd nadal występuje, więc rozwiązaniem było określenie lokalizacji pobierania jajka w języku Python: sudo pip install -Iv pypi.python.org/packages/source/p/pyparsing/ ...
lefterav
45
Dlaczego nie po prostu pip install pyparsing==1.5.7?
Suor
57

W repozytorium pip znajduje się nowy pakiet o nazwie pydot2, który działa poprawnie z pyparsing2. Nie mogłem obniżyć wersji moich pakietów, ponieważ matplotlib zależy od nowszego pakietu pyparsing.

Uwaga: python2.7 z macports

Dana the Sane
źródło
7
IMHO Tę odpowiedź należy rozważyć w porównaniu z pyparsing downgrading Idea. Dla mnie działa również doskonale z networkx. Dzięki !
Raghav RV,
Nadal wyświetla ten błąd, ale błąd dot_parser zniknął. Musisz zainstalować pydot, pydotprintaby działał.
Inanc Gumus
21

pydot użył prywatnej zmiennej modułu (_noncomma) z pyparsing. Poniższa różnica naprawia ją do użycia w pyparsingu 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
źródło
2
Dla kompletności, oto raport o problemie dla pydot, który zgłasza ten problem i poprawkę wspomnianą przez @Gabi Davar.
Jack Kelly,
7

Rozwidliłem repozytorium pydot [1], zastosowałem łatkę Gabi Davar i kilka zmian, aby obsługiwać Python-3. Pakiet jest dostępny w PyPI [2].

Twoje zdrowie

David Villa
źródło
1
Wygląda na to, że strona PyPI nie działa. Szkoda! Jakieś pomysły, dlaczego?
Dav Clark,
pakiet pip wydaje się być uszkodzony. pip install...nie powiodło się w środku bez wyraźnego błędu. Wygląda na to, że manifest i rzeczywiste pliki nie pasują. Sprawdzam repozytorium git, a mv README.rst READMEpotem python setup.py install. To zadziałało dla mnie :-)
Kenji Noguchi
2
link pypi.python.org/pypi/pydot2 jest uszkodzony, ale pip install pydot2działa, a ten link, pypi.python.org/pypi/pydot2/1.0.32 , działa.
Mark Mikofski
5

Rozwiązaniem nie było zainstalowanie pydota skądś, ale „python-pydot” z oficjalnych repozytoriów Ubuntu.

Sadik
źródło
Od 25 sierpnia 2013 pip install python-pydotnie działa dla mnie (nie znaleziono dystrybucji); pip install pydotrobi. Więc nie sądzę, że pydotjest to koniecznie nieoficjalne. Być może zamiast tego instalowałeś za pośrednictwem dystrybucji systemu operacyjnego?
Owen S.,
5
Nie z pipem, sudo apt-get install python-pydotzrobiłem to dla mnie.
Sadik,
To prawdopodobnie zadziałałoby, ponieważ Ubuntu ma obecnie python-pyparsingwersję 1.5.2, co pozwala uniknąć niezgodności wersji wymienionej powyżej. Poszedłem z powyższą poprawką i od tego czasu nie miałem problemów. Dzięki!
Owen S.,
1
Niestety w Ubuntu od Saucy pyparsing został zaktualizowany, ale pydot nie został odpowiednio poprawiony.
Tully
1
Złożyłem
Tully
3

Istnieją teraz co najmniej 2 dodatkowe wersje, które wydają się wspierać PyParsing-2 i Python-3:

  • PyDotPlus autorstwa Carlosa Jenkinsa z niezłym buildbotem Travisa i ciekawą dokumentacją . Jednak trzeba będzie zmienić nazwę folderu z site-packages\pydotplusaby site-packages\pydotgo do pracy z istniejących programów, które importują pydot.
  • pydot3k przez bmcorser . Niestety nie zadziałało!
  • prologic / pydot autorstwa Jamesa Millsa, do którego prowadzi link z oficjalnej strony kodowej pydot Google jako ...

    gałąź zapewniająca zgodność z Python 3

  • a oto działające łącze do pydot2 Davida Villi, które działa dobrze: https://pypi.python.org/pypi/pydot2/1.0.32

Mark Mikofski
źródło
3

Ponownie miałem problem i powyższe rozwiązanie nie zadziałało. Jeśli to prawda i używasz również Anacondy na komputerze Mac z El Capitan, spróbuj tego:

conda install --channel https://conda.anaconda.org/RMG graphviz`
conda install --channel https://conda.anaconda.org/RMG pydot
scottlittle
źródło
3

Co zrobiłem na koniec po tylu próbach z tego, co tutaj widziałem (pseudo sekwencja, aby działała dla 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
źródło
2

To zadziałało dla mnie (Mac OS X 10.9 z Pythonem 2.7.10 na Anaconda):

conda uninstall pydot

Następnie,

conda install pydot

Pyparsing jest następnie obniżany (z 2.x do 1.5.7) po instalacji pydota. Przyszli pracownicy Google: pozwoliło mi to poprawnie zainstalować i zaimportować Theano.

scottlittle
źródło
1

Na OSX Mavericks udało się wykonać następujące czynności ... Otrzymałem ten sam błąd, ale na dole była też skarga, że ​​plik wykonywalny graphviz nie był obecny ... Myślę, że problem polegał na tym, że zainstalowałem Graphviz przed innymi modułami?

brew uninstall graphviz
brew install graphviz
ecordo
źródło
1

Jeśli inne rozwiązania nie działają, jest to szybka i brudna metoda rozwiązania problemu:

Ten przykład pochodzi z Pythona 2.7 na Ubuntu 16.04.

Edytuj plik python2.7 / site-packages / keras / utils / visualize_util.py i skomentuj segment kodu poniżej.

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

find_graphviz () jest zbędna w nowszych wersjach pydot, a powyższe wywołanie nie działa.

Totoro
źródło
1

Spotkałem też problem i mój pydot == 1.0.28 podczas pyparsing == 2.2.0. Rozwiązałem problem, pobierając najnowszy pydot 1.2.3 (tar.gz) z Google, a następnie instalując go offline. Kiedy zaktualizowałem pydot w Ubuntu 14.04, powiedziałem, że pydot 1.0.28 jest najnowszą wersją. Dlatego pobieram z google wersję 1.2.3.

Cna
źródło
0

Musisz obniżyć pyparsing z wersji 2.x do wersji 1.5.7, aby pydot działał poprawnie.

W przypadku win-64, używając Conda, działało to dla mnie:

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

Następnie wyłączyłem / odinstalowałem wersję 2.x i ponownie załadowałem pyparsing w moim skrypcie:

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

Aby sprawdzić, czy masz uruchomioną odpowiednią wersję:

print pyparsing.__version__
Sander van den Oord
źródło