O GraphViz não funciona quando importado dentro do PydotPlus (`executáveis ​​do GraphViz não encontrados`)


17

Estou tentando fazer esses pacotes funcionarem há algum tempo, mas sem sucesso. Basicamente, o erro é:

GraphViz's Executables not found

EDIT : eu não tinha postado um terminal logcom o erro originalmente. Estou usando Ubuntuagora para não conseguir reproduzir exatamente o mesmo erro que cometi no passado (um ano atrás, tão distante no passado ...). No entanto, estou enfrentando um erro semelhante - se não o mesmo - na minha configuração atual; mesmo enquanto estiver usando um ambiente virtual com pipenv. O erro parece vir de linhas que foram descritas na resposta de @ 张 乾元 :

Traceback (most recent call last):
  File "example.py", line 49, in <module>
    Image(graph.create_png())
  File "/home/philippe/.local/lib/python3.6/site-packages/pydotplus/graphviz.py", line 1797, in <lambda>
    lambda f=frmt, prog=self.prog: self.create(format=f, prog=prog)
  File "/home/philippe/.local/lib/python3.6/site-packages/pydotplus/graphviz.py", line 1960, in create
    'GraphViz\'s executables not found')
pydotplus.graphviz.InvocationException: GraphViz's executables not found

Eu tentei instalar GraphVizvia 2 maneiras diferentes: via pip install graphvize através do .msipacote (e também tentei instalar pydot, pydotpluse graphvizem muitas ordens diferentes).

O código que estou tentando executar é simplesmente um dot-to-pngconversor para o conjunto de dados Iris .

from sklearn.tree import DecisionTreeClassifier
import sklearn.datasets as datasets
from sklearn.externals.six import StringIO
from sklearn.tree import export_graphviz

import pandas as pd
import pydotplus

from IPython.display import Image

iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns = iris.feature_names)
y = iris.target

dtree = DecisionTreeClassifier()
dtree.fit(df,y)

dot_data = StringIO()
export_graphviz(
    dtree, 
    out_file = dot_data,
    filled = True, 
    rounded = True,
    special_characters = True
)
graph_1 = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph_1.create_png())

Dentro Jupyter Notebookse fora Atom, o sistema parece estar procurando por GraphVizdentro pydotplus, como aponta ~\Anaconda3\lib\site-packages\pydotplus\graphviz.py. Não deveria ser o contrário?

Por fim, quero apenas salientar que já tentei adicionar GraphVizo caminho do sistema ao PATHuso C:\Users\Philippe\Anaconda3\Library\bin\graphviz.


2
Muito obrigado por fazer esta pergunta.
— AturSams 16/05/19

A melhor maneira de lidar com esses problemas problemáticos de instalação provavelmente usando algum tipo de ambiente independente como pipenv, virtualenvou Docker Containers, embora eu ainda não o tenha verificado adequadamente.
— Philippe Fanaro

Respostas:


15

Veja: Os executáveis ​​do Graphviz não são encontrados (Python 3.4) e o pacote graphviz não adiciona o executável ao PATH nas janelas # 1666 e Problema com o graphviz # 1357 - é um problema recorrente (para esse programa) com as configurações da variável de ambiente PATH. A instalação de versões específicas ou em uma ordem específica ou a adição manual de um PATH corrigem o problema.

É melhor que o Package defina o PATH corretamente e o remova quando você desinstala o Pacote (para não ter um PATH longo demais - o que geralmente não acontece). A configuração manual evita quebras futuras e o force a funcionar, mas você precisará remover manualmente o texto extra se desinstalar o Pacote.

Aqui está o conselho desses três links:

  1. pip install graphviz
  2. conda install graphviz

ou

Você precisa correr

conda install python-graphviz

ao invés de

pip install graphviz

para obter essas ligações, que também funcionam com o pacote Graphviz da conda.

ou

  1. Faça o download e instale o graphviz-2.38.msi (use a versão mais recente) em https://graphviz.gitlab.io/_pages/Download/Download_windows.html

  2. Defina a variável do caminho

        (a) Painel de Controle> Sistema e Segurança> Sistema> Configurações Avançadas do Sistema> Variáveis ​​de Ambiente> Caminho> Editar

        (b) adicione 'C: \ Arquivos de Programas (x86) \ Graphviz2.38 \ bin'


Foi exatamente o que descrevi que fiz no post. E os outros links que você mencionou também já tinham visto ou tentado. Eles também estão ficando velhos, então pensei que talvez alguém tivesse encontrado uma solução melhor nesse meio tempo.
— Philippe Fanaro

Acho que vou tentar, talvez amanhã, desinstalar tudo o que tenho relacionado ao python e ver o que acontece, talvez uma planilha limpa ajude, idk.
— Philippe Fanaro

Ainda não consigo executar o GraphViz depois de testar todos os métodos acima
— Revolucion for Monica

@IggyPass, esta resposta tem quase dois anos. Eu verifiquei o segundo link acima e o BR foi fechado; uma correção é oferecida. O terceiro link sugere a terceira solução que apresentei, aparentemente essa ainda é a versão compilada de terceiros mais recente oferecida; as versões mais recentes são oferecidas apenas na fonte e você precisa compilá-las. Estou usando um telefone celular enquanto espero comprar um computador novo, infelizmente não poderei atualizar esta resposta até então; a versão pré-compilada e a maioria dessas respostas compartilham um tema comum, você precisa definir o PATH adequadamente para o seu sistema.
— Rob

5

No meu caso, consigo encontrar graphvizexecutáveis ​​manualmente anaconda3\Library\bin\graphviz, mas ainda assim recebo o GraphViz's Executables not founderro.

Tentei, sem sucesso, a sugestão de zhangqianyuan, bem como ordens específicas de instalação e uso de módulos python-graphviz(solução oficial, amplamente discutida aqui ). A única coisa que não tentei foi adulterar minha PATHvariável em todo o sistema.

Um método que funcionou para mim foi inserir essas linhas no meu código (antes das funções relacionadas ao graphviz):

import os

os.environ['PATH'] = os.environ['PATH']+';'+os.environ['CONDA_PREFIX']+r"\Library\bin\graphviz"

Este é um pequeno truque sujo, mas existem algumas vantagens:

  • PATHas alterações estão em vigor localmente e até o osmódulo ser recarregado
  • Não há necessidade de alterar os scripts do módulo
  • Não há necessidade de alterar todo o PATHsistema

Estou usando Python 3.7, Windows 10, Anaconda. O Graphviz foi instalado usando conda install python-graphviz, mas não acredito que exista diferença neste caso


2

Se você possui o Anaconda, pode usar o gerenciador do Conda.

Digite Condano Painel Iniciar e tente instalar via Conda.

Por exemplo:

pip3 install graphviz

11
(...) Eu já tentei isso ...
— Philippe Fanaro

Mas via gerente da Conda?
— fuwiak

Sim, eu fiz, e em várias ordens diferentes.
— Philippe Fanaro

2

O que funcionou no meu caso de uso : Gerando diagramas de modelo no Django. Mas também pode ser estendido para gerar diagramas para outras aplicações.

Eu instalei o GraphVizpara visualizar o gráfico do .dotarquivo. Pode ser instalado a partir de graphviz.org .

  1. Crie um arquivo de ponto associado ao projeto:

    python manage.py graph_models -a > dotfile.dot

    Ou você pode criar os .dotarquivos para vários aplicativos. Referência: Usando django-extensions para visualizar o diagrama do banco de dados no aplicativo django , por Thomas .

  2. Agora você só precisa ver dotfile.dot. Então, onde devo ver isso como uma imagem?

    • Agora abra o arquivo gvedit.exe(não sei no que está o arquivo correspondente Linux) no caminho não solicitado do aplicativo.
      • Para Windows: C:\Program Files (x86)\Graphviz2.38\bin\gvedit.exe.
  3. Agora execute gvedit.exee abra o .dotarquivo criado até agora.


1
  1. Encontrar:C:\Users\zhangqianyuan\AppData\Local\Programs\Python\Python36\Lib\site-packages\pydotplus

  2. Aberto graphviz.py

  3. Encontre a linha 1925 - linha 1972, encontre a função:

    def create(self, prog=None, format='ps'):
  4. Na função encontre:

    if prog not in self.progs:
        raise InvocationException(
            'GraphViz\'s executable "%s" not found' % prog)
    
    if not os.path.exists(self.progs[prog]) or \
            not os.path.isfile(self.progs[prog]):
        raise InvocationException(
            'GraphViz\'s executable "{}" is not'
            ' a file or doesn\'t exist'.format(self.progs[prog])
        )
  5. Entre os dois blocos, adicione este (caminho executável do seu Graphviz):

      self.progs[prog] = "C:/Program Files (x86)/Graphviz2.38/bin/gvedit.exe"`
  6. Depois de adicionar o resultado é:

    if prog not in self.progs:
        raise InvocationException(
            'GraphViz\'s executable "%s" not found' % prog)
    
    self.progs[prog] = "C:/Program Files (x86)/Graphviz2.38/bin/gvedit.exe"
    
    if not os.path.exists(self.progs[prog]) or \
            not os.path.isfile(self.progs[prog]):
        raise InvocationException(
            'GraphViz\'s executable "{}" is not'
            ' a file or doesn\'t exist'.format(self.progs[prog])
        )
  7. salve o arquivo alterado e poderá executá-lo com sucesso.

  8. é melhor salvá-lo como arquivo bmp porque o arquivo png não funcionará. a foto está aqui


0

Eu tive o mesmo problema, de modo que acabei de instalar o pydotplus de forma independente (pip3 install pydotplus) e importar o pydotplus, tudo funciona bem.


0

Eu tive o mesmo problema e fiz tudo o que foi sugerido neste e em outros fóruns e nada deu certo. As instruções a seguir resolverão 100% esse problema se você estiver usando o Windows e o Python 3:

  1. Instale pydotplusvia conda:conda install pydotplus

  2. Instale de forma graphvizindependente conda install python-graphviz(se você já executou essas duas etapas, vá direto para a etapa 3)

  3. Supondo que você já tem graphviz e pydotplus instalado, encontrar o graphviz.pyarquivo no seu pydotplus diretório de instalação, no meu caso, foi no seguinte caminho:C:\Users\Acevedo\Anaconda3\Lib\site-packages\pydotplus\graphviz.py

  4. Abra graphviz.pye encontre este bloco na linha 606

    # Method 3 (Windows only)
    if os.sys.platform == 'win32':
    
        # Try and work out the equivalent of "C:\Program Files" on this
        # machine (might be on drive D:, or in a different language)
        if 'PROGRAMFILES' in os.environ:
            # Note, we could also use the win32api to get this
            # information, but win32api may not be installed.
            path = os.path.join(
                os.environ['PROGRAMFILES'], 'ATT', 'GraphViz', 'bin'
            )
        else:
            # Just in case, try the default...
            path = r"C:\Program Files\att\Graphviz\bin"
    
        progs = __find_executables(path)
  5. Comentar o if / else parte e codificar o caminho do seu graphviz diretório de instalação, dentro do qual devem ser os executáveis ( dot.exe, circo.exe, gvedit.exe, etc.). O novo código deve ficar assim:

    # Method 3 (Windows only)
    if os.sys.platform == 'win32':
    
        # Try and work out the equivalent of "C:\Program Files" on this
        # machine (might be on drive D:, or in a different language)
        """if 'PROGRAMFILES' in os.environ:
            # Note, we could also use the win32api to get this
            # information, but win32api may not be installed.
            path = os.path.join(
                os.environ['PROGRAMFILES'], 'ATT', 'GraphViz', 'bin'
            )
        else:
            # Just in case, try the default...
            path = r"C:\Program Files\att\Graphviz\bin"
            """
        path = r"C:\Users\Acevedo\Anaconda3\Library\bin\graphviz"
    
        progs = __find_executables(path)
  6. Salve o graphviz.pyarquivo e tudo deve funcionar muito bem :)


0

Atualizando através da execução no prompt do anaconda:

conda install python-graphviz

até a versão 2.38 (16/10/2019) fez o truque para mim.


0

Navegado para o diretório anaconda

C:\ProgramData\Anaconda3\Library\bin

Percebi que o Graphviz já estava instalado, tudo o que fiz foi ir ao

Control Panel > System and Security > System > Advanced System Settings > Environment Variables > Path > Edit

e acrescentou

"C:\ProgramData\Anaconda3\Library\bin\graphviz"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.