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.

Philippe Fanaro
fonte
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'

Roubar
fonte
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

Sarunas
fonte
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
fuwiak
fonte
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.

sbhusal123
fonte
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

张 乾元
fonte
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.

consulta de risco
fonte
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 :)

Armando Acevedo Luna
fonte
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.

Senya
fonte
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"

Raymond Confidence
fonte