Ошибка pydot и graphviz: не удалось импортировать dot_parser, загрузка файлов точек будет невозможна

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

Садик
источник
6
pip install pydot2должен исправить эту проблему. Намного лучше, чем использование, pip uninstallпотому что если вы поделитесь кодом, вы можете просто добавить pydot2 в свой файл requirements.txt и не позволять пользователям запускать незнакомые команды.
RussellStewart

Ответы:

220

Ответ для pydot >= 1.1:

Несовместимость (восходящего потока) pydotбыла исправлена 6dff94b3f1 , и поэтому pydot >= 1.1будет совместим сpyparsing >= 1.5.7 .


Ответ применим к pydot <= 1.0.28:

Для всех, кто сталкивается с этим, это связано с изменениями в pyparsing с версии 1.x до версии 2.x. Чтобы установить pydot с помощью pip, сначала установите старую версию pyparsing:

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

Если вы не устанавливали pyparsingusing pip, а использовали вместо этого setup.py, ознакомьтесь с этим решением, чтобы удалить пакет. Спасибо @qtips.

Джонатан
источник
1
Я установил NetworkX, GraphViz и pydot, но не смог заставить функциональность Graphviz работать с NetworkX (например, этот пример NetworkX не удался). Я все время получал: глобальное имя dot_parser не определено . Ваше решение решило эту проблему.
qtips
1
также sudo pip uninstallне работает, если вы установили свой пакет, используя python setup.py installв этом случае, следуйте этому решению. По крайней мере, так было на моем Mac Mountain Lion OSX
qtips
sudoочевидно, не всегда необходимо, например, если вы используете virtualenv. Кроме этого, у меня это сработало!
Дэвид Рейнольдс
В Ubuntu 12.04 я получаю эту ошибку при установке обхода: «Запрошен pyparsing == 1.5.7, но устанавливается версия 2.0.1». Тогда ошибка, указанная выше, все еще возникает. Итак, решение заключалось в том, чтобы указать место загрузки яйца python: sudo pip install -Iv pypi.python.org/packages/source/p/pyparsing/…
lefterav
45
Почему не просто так pip install pyparsing==1.5.7?
Suor
57

В репозитории pip есть новый пакет под названием pydot2, который правильно работает с pyparsing2. Я не мог понизить версию своих пакетов, потому что matplotlib зависит от нового пакета pyparsing.

Примечание: python2.7 из macports

Дана Разумная
источник
7
IMHO Этот ответ следует учитывать по сравнению с идеей понижения версии pyparsing. У меня тоже отлично работает с networkx. Спасибо !
Raghav RV
По-прежнему выдает эту ошибку, но ошибка dot_parser исчезла. Вы должны установить pydot для pydotprintработы.
Inanc Gumus
21

pydot использовал частную переменную модуля (_noncomma) из pyparsing. Приведенный ниже diff исправляет его для использования для 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.
Джек Келли
7

Я разветвил репозиторий pydot [1], применил патч Gabi Davar и некоторые изменения для поддержки python-3. Пакет доступен в PyPI [2].

Ура

Давид Вилла
источник
1
Страница PyPI не работает. Это очень плохо! Есть идеи, почему?
Dav Clark
пакет pip кажется сломанным. pip install...не удалось посередине без явной ошибки. Похоже, что манифест и фактические файлы не совпадают. Я проверяю репозиторий git, а mv README.rst READMEзатем python setup.py install. У меня это сработало :-)
Kenji Noguchi
2
ссылка pypi.python.org/pypi/pydot2 не pip install pydot2работает, но работает, и эта ссылка, pypi.python.org/pypi/pydot2/1.0.32 , работает.
Марк Микофски
5

Решением было не устанавливать pydot откуда-то, а «python-pydot» из официальных репозиториев ubuntu.

Садик
источник
По состоянию на 25.08.2013 pip install python-pydotу меня не работает (раздача не найдена); pip install pydotделает. Так что я не думаю, что pydotэто обязательно неофициально. Возможно, вы вместо этого выполняли установку через дистрибутив ОС?
Оуэн С.
5
Не с пипсом, sudo apt-get install python-pydotсделал это за меня.
Sadik
Это, вероятно, сработает, потому что в настоящее время Ubuntu имеет python-pyparsingверсию 1.5.2, что позволяет избежать несовместимости версий, перечисленных выше. Я использовал исправление, указанное выше, и с тех пор проблем не было. Спасибо!
Оуэн С.
1
К сожалению, в Ubuntu, начиная с Saucy, pyparsing был обновлен, но pydot не был исправлен соответствующим образом.
Талли
1
Я подал заявку на исправление пакета Ubuntu: bugs.launchpad.net/ubuntu/+source/pydot/+bug/1321135
Талли,
3

Сейчас есть как минимум еще две версии, которые поддерживают PyParsing-2 и Python-3:

  • PyDotPlus от Карлоса Дженкинса с хорошим сборщиком travis и красивой документацией . Однако вам нужно будет изменить имя папки с site-packages\pydotplusна, site-packages\pydotчтобы он работал с существующими программами, импортирующими pydot.
  • pydot3k пользователя bmcorser . К сожалению, не вышло!
  • prologic / pydot от Джеймса Миллса, на которую ссылается официальная кодовая страница Google pydot как ...

    ветка для совместимости с Python 3

  • и вот рабочая ссылка на pydot2 Дэвида Виллы, которая отлично работает: https://pypi.python.org/pypi/pydot2/1.0.32

Марк Микофски
источник
3

У меня снова возникла проблема, и мое вышеупомянутое решение не сработало. Если это верно для вас, и вы также используете Anaconda на Mac с El Capitan, попробуйте следующее:

conda install --channel https://conda.anaconda.org/RMG graphviz`
conda install --channel https://conda.anaconda.org/RMG pydot
Скоттлиттл
источник
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'
#
стенка
источник
2

Это сработало для меня (Mac OS X 10.9 с Python 2.7.10 на Anaconda):

conda uninstall pydot

Затем,

conda install pydot

Затем Pyparsing понижается (с 2.x до 1.5.7) после установки pydot. Будущие гуглеры: это позволило мне правильно установить и импортировать Theano.

Скоттлиттл
источник
1

На OSX Mavericks сработало следующее ... Я получил ту же ошибку, но внизу также была жалоба на отсутствие исполняемого файла graphviz ... Я думаю, проблема заключалась в том, что я установил graphviz до других модулей?

brew uninstall graphviz
brew install graphviz
экордо
источник
1

Когда другие решения не работают, это быстрый и грязный метод решения проблемы:

Этот пример взят из python 2.7 на Ubuntu 16.04.

Отредактируйте файл 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, и вышеуказанный вызов не работает.

Тоторо
источник
1

Я также столкнулся с проблемой и моим pydot == 1.0.28 во время pyparsing == 2.2.0. Я исправил проблему, загрузив новейшую версию pydot 1.2.3 (tar.gz) из Google, а затем установив ее в автономном режиме. Когда я обновил pydot в ubuntu 14.04, он сказал, что pydot 1.0.28 - самая новая версия. Поэтому качаю с гугла версию 1.2.3.

Cna
источник
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__
Сандер ван ден Оорд
источник