macOS High Sierra, MacPorts, Enthought Canopy, graphviz

Я пытаюсь визуализировать некоторые деревья решений, используя графическую визуализацию, как описано здесь. Насколько я понял ситуацию с одной стороны, нужно иметь графвиз, а также библиотеку/библиотеки python, чтобы иметь возможность взаимодействовать с этим из кода python.

Поэтому, чтобы сначала использовать Grapviz, я попытался установить graphviz через MacPorts с помощью следующей команды: sudo port install graphviz после обновления моих MacPorts с помощью команды: sudo port selfupdate как было описано здесь. Во-вторых, я установил graphviz_py и pydot через собственный менеджер пакетов Enthought Canopy и graphviz через: pip install graphviz из терминала Python Canopy. Эти различные пакеты обсуждаются в случае с pydot здесь и в случае с graphviz здесь.

После выполнения вышеуказанных шагов я просто не смог ни отобразить фигуру в блокноте Jupyter, ни сохранить ее в виде файла PDF в некоторых папках.

Может ли кто-нибудь указать на то, что мне не хватает или я делаю неправильно! Погуглив какое-то время, я не смог найти решение в моем случае.

Я использую Macintosh с macOS High Sierra. Я использую MacPorts, чтобы получить базовые настройки по умолчанию, а не с распределенными пакетами и Enthought Canopy в качестве Python по умолчанию.

Весь код и возвращенные сообщения об ошибках находятся прямо ниже.

from sklearn import tree 
import graphviz

#visualisation of decision trees
dot_data = tree.export_graphviz(DeciTreeModel, out_file=None) 
graph = graphviz.Source(dot_data) 
graph.render("Titanic",view=True)

ExecutableNotFoundTraceback (most recent call last)
<ipython-input-39-30a50c1271e0> in <module>()
      5 dot_data = tree.export_graphviz(DeciTreeModel, out_file=None)
      6 graph = graphviz.Source(dot_data)
----> 7 graph.render("Titanic",view=True)

/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/graphviz/files.pyc in render(self, filename, directory, view, cleanup, format, renderer, formatter)
    186             format = self._format
    187 
--> 188         rendered = backend.render(self._engine, format, filepath, renderer, formatter)
    189 
    190         if cleanup:

/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/graphviz/backend.pyc in render(engine, format, filepath, renderer, formatter, quiet)
    181     """
    182     cmd, rendered = command(engine, format, filepath, renderer, formatter)
--> 183     run(cmd, capture_output=True, check=True, quiet=quiet)
    184     return rendered
    185 

/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/graphviz/backend.pyc in run(cmd, input, capture_output, check, quiet, **kwargs)
    148     except OSError as e:
    149         if e.errno == errno.ENOENT:
--> 150             raise ExecutableNotFound(cmd)
    151         else:  # pragma: no cover
    152             raise

ExecutableNotFound: failed to execute ['dot', '-Tpdf', '-O', 'Titanic'], make sure the Graphviz executables are on your systems' PATH

РЕДАКТИРОВАТЬ:

Используя фрагменты терминала, предложенные @Craig, я получил следующие результаты:

Gergely-Mathes-MacBook-Pro:~ gergelymathe$ port contents graphviz | grep /bin/
  /opt/local/bin/acyclic
  /opt/local/bin/bcomps
  /opt/local/bin/ccomps
  /opt/local/bin/circo
  /opt/local/bin/cluster
  /opt/local/bin/diffimg
  /opt/local/bin/dijkstra
  /opt/local/bin/dot
  /opt/local/bin/dot2gxl
  /opt/local/bin/dot_builtins
  /opt/local/bin/dotty
  /opt/local/bin/edgepaint
  /opt/local/bin/fdp
  /opt/local/bin/gc
  /opt/local/bin/gml2gv
  /opt/local/bin/graphml2gv
  /opt/local/bin/gv2gml
  /opt/local/bin/gv2gxl
  /opt/local/bin/gvcolor
  /opt/local/bin/gvgen
  /opt/local/bin/gvmap
  /opt/local/bin/gvmap.sh
  /opt/local/bin/gvpack
  /opt/local/bin/gvpr
  /opt/local/bin/gxl2dot
  /opt/local/bin/gxl2gv
  /opt/local/bin/lefty
  /opt/local/bin/lneato
  /opt/local/bin/mm2gv
  /opt/local/bin/neato
  /opt/local/bin/nop
  /opt/local/bin/osage
  /opt/local/bin/patchwork
  /opt/local/bin/prune
  /opt/local/bin/sccmap
  /opt/local/bin/sfdp
  /opt/local/bin/tred
  /opt/local/bin/twopi
  /opt/local/bin/unflatten
  /opt/local/bin/vimdot

и

Gergely-Mathes-MacBook-Pro:~ gergelymathe$ which dot
/opt/local/bin/dot

Будут ли эти результаты означать правильное поведение? Исходная проблема не решается. Он все еще сохраняется.

РЕДАКТИРОВАТЬ 1:

Я запустил echo $PATH в терминале, как это было предложено @tripleee, и получил вывод

Gergely-Mathes-MacBook-Pro:~ gergelymathe$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/gergelymathe/Desktop/Szakdolgozat/Munka/Program:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin

So /opt/local/bin is in my $PATH.

РЕДАКТИРОВАТЬ 2:

Я выполнил свой $PYTHONPATH в соответствии с этот пост с /opt/local/bin:/opt/local/sbin в качестве исполняемых файлов graphviz на моем системном пути pythonic. Вы могли бы догадаться! Исходная ошибка по-прежнему сохраняется, несмотря на то, что пути содержат /opt/local/bin:/opt/local/sbin. Выходные данные пути в случае моего терминала Canopy:

>>> import sys, pprint
>>> pprint.pprint(sys.path)
['',
 '/opt/local/bin',
 '/opt/local/sbin',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python27.zip',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/plat-darwin',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/plat-mac',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/lib-tk',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/lib-old',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/lib-dynload',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages']

и в случае моего ноутбука Jupyter:

import sys
sys.path
['',
 '/opt/local/bin',
 '/opt/local/sbin',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python27.zip',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/plat-darwin',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/plat-mac',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/lib-tk',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/lib-old',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/lib-dynload',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages',
 '/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/IPython/extensions',
 '/Users/gergelymathe/.ipython']

Насколько я понял текущую ситуацию согласно этот пост, исходная ошибка не должна сохраняться!

РЕДАКТИРОВАТЬ 3:

Как отметил @tripleee в комментарии ниже, я проверил os PATH из своего работающего ноутбука Jupyter. Что я получил:

import os
print(os.environ['PATH'])
/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/bin:/Users/gergelymathe/Library/Enthought/Canopy/edm/envs/User/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin

, которое отличается от значения PATH, полученного из терминала и указанного в разделе EDIT 1 моего поста. Может ли кто-нибудь указать, почему эти два разных и как их можно синхронизировать?

Любая дальнейшая помощь высоко ценится!


person Gergely Mathe    schedule 06.12.2018    source источник
comment
make sure the Graphviz executables are on your systems' PATH т. е.: где находится исполняемый файл dot? Это каталог в вашей системе PATH?   -  person Jonathan March    schedule 06.12.2018
comment
Я не могу найти исполняемый файл graphviz под /opt/local/bin, куда MacPorts, насколько мне известно, обычно помещает исполняемый файл. Это может быть проблемой, потому что /opt/local/bin является частью моей переменной $PATH.   -  person Gergely Mathe    schedule 07.12.2018
comment
По умолчанию исполняемые файлы graphviz устанавливаются в /opt/local/bin. Вы можете проверить с помощью 'port content graphviz | grep/бин/'. Также попробуйте «какая точка», чтобы убедиться, что ваш PATH работает правильно. (Вам может потребоваться выйти из системы или войти в систему, чтобы новая PATH вступила в силу. Существуют и другие способы, но это самый простой.)   -  person Craig    schedule 08.12.2018
comment
@Craig Я обновил свой пост выводом фрагментов, предложенных вами.   -  person Gergely Mathe    schedule 10.12.2018
comment
Так есть ли /opt/local/bin в PATH, который подвергается воздействию этой программы Python? Можете ли вы запустить ту же команду в командной строке?   -  person tripleee    schedule 10.12.2018
comment
@tripleee, я отредактировал свой пост, указав значение моей переменной PATH. Не могли бы вы уточнить, что вы имеете в виду под «Можете ли вы запустить ту же команду в командной строке?» Большое спасибо!   -  person Gergely Mathe    schedule 11.12.2018
comment
В командной строке Bash команда dot -Tpdf -O Titanic выполняется без ошибок? Возможно, вам придется воспроизвести некоторые механизмы, созданные вашим скриптом Python; но, по крайней мере, он не должен производить что-то глупое, например, неверную опцию или срок действия лицензии omg, заплатите больше денег.   -  person tripleee    schedule 11.12.2018
comment
@tripleee, спасибо, понял. Я запустил dot -Tpdf -O Titanic из командной строки, и это сработало. Я получил правильный вывод в формате pdf. Таким образом, ошибка, вероятно, связана с моим дистрибутивом Python, которым является Enthought Canopy.   -  person Gergely Mathe    schedule 11.12.2018
comment
Скорее всего, ваш блокнот Jupyter работает с другим PATH, чем вы видите в подсказке.   -  person tripleee    schedule 11.12.2018
comment
@tripleee, не могли бы вы уточнить свой ответ? Я проверил PATH своего ноутбука Jupyter через sys.path и получил другой вывод по сравнению с echo $PATH с моего терминала. Поэтому я устал редактировать свой jupyter PATH, как написано modules-in-jupyter">здесь, но добавление /opt/local/bin в мой jupyter PATH через sys.path.append("/opt/local/bin") не помогло. Я все еще получаю то же самое сообщение об ошибке.   -  person Gergely Mathe    schedule 12.12.2018
comment
Я недостаточно знаком с Jupyter, чтобы опубликовать фактический ответ. Попробуйте закрыть его и запустить из командной строки, где у вас есть правильный PATH.   -  person tripleee    schedule 12.12.2018
comment
@tripleee, я отредактировал свой пост в соответствии с вашим последним предложением. У вас есть дальнейшие идеи, что попробовать?   -  person Gergely Mathe    schedule 08.01.2019
comment
Значение sys.path соответствует PYTHONPATH, а не PATH — вы напечатали не то. Тот, кого нужно исследовать, это import os; print(os.environ['PATH])`   -  person tripleee    schedule 08.01.2019
comment
@тройной! Хорошо, я понял твою точку зрения. Я отредактировал свой пост с выводом вашего фрагмента. Проблема здесь, насколько я понимаю ситуацию. Как вы можете проверить, вывод PATH из ноутбука jupyter отличается от PATH из терминала (см. РЕДАКТИРОВАТЬ 1). Я не знаю, как эти два могут отличаться, например, как python видит другую систему PATH. Не могли бы вы дать какое-то объяснение этой ситуации и как ее можно решить? Огромная благодарность за вашу очень ценную помощь!   -  person Gergely Mathe    schedule 09.01.2019
comment
Опять же, это зависит от того, как вы запускаете Jupyter, но, безусловно, есть обходной путь в stackoverflow.com/questions/37890898/   -  person tripleee    schedule 09.01.2019
comment
@трипли! Ура, моя проблема решена! Большое спасибо!   -  person Gergely Mathe    schedule 09.01.2019