为什么在Windows 8中pydot无法找到GraphViz可执行文件?

75
我已经在Windows 8上安装了GraphViz 2.32,并将C:\Program Files (x86)\Graphviz2.32\bin添加到系统PATH变量中。但是,Pydot仍然找不到其可执行文件。
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    graph.write_png('example1_graph.png')
  File "build\bdist.win32\egg\pydot.py", line 1809, in <lambda>
    lambda path, f=frmt, prog=self.prog : self.write(path, format=f, prog=prog))
  File "build\bdist.win32\egg\pydot.py", line 1911, in write
    dot_fd.write(self.create(prog, format))
  File "build\bdist.win32\egg\pydot.py", line 1953, in create
    'GraphViz\'s executables not found' )
InvocationException: GraphViz's executables not found

我发现了这个链接,但是无法解决问题。


现在,您可以使用“sklearn.tree.plot_tree”可视化树形结构,而无需安装dot。 - Andreas Mueller
28个回答

2
在Windows系统中,即使安装了graphviz-2.38.msi,你仍然可以在位于site-package文件夹下的pydot.py中添加自己的路径。请注意,不要删除原有的HTML标签。
 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 os.environ.has_key('PROGRAMFILES'):

        # 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:\PYTHON27\GraphViz\bin"  # add here.

1
我应该注意到你指出的else子句并不总是被执行。因此,我在find_grapviz()的开头添加了显式路径。当然,这是非常肮脏的解决方案,但是我在尝试让事情正常工作时浪费的愚蠢时间非常令人恼火。所以,实际上这是一个很好的hack。 - dmitry

2

我之前也遇到了同样的问题,最终通过查看库解决了它。

该库认为路径应设置为C:\Program Files\ATT\Graphviz\bin,但默认情况下,Graphviz安装在C:\Program Files(x86)\Graphviz,符合32位标准,因此pydot无法获取所需的路径。只需按脚本要求移动目录即可。

P.S.:请考虑对环境变量进行相应更改。

P.S.S.:还要检查Graphviz是否直接位于Program Files(x86)或ATT下。


1
以下是关于graphviz的一些要点:
1. graphviz不仅是一个Python模块,而且还是一个独立的程序。我相信你需要同时使用两者才能使graphviz正常工作。
2. 独立的graphviz程序最初由AT&T开发,后来开源,然后被放弃了。该软件包的当前维护者忘记包括Windows注册表项,以便Python可以找到程序可执行文件。
3. pydotplus\graphviz.py的第620行包括一个备用路径,以查找如果在注册表中找不到graphviz,则使用旧的ATT文件路径。将文件路径更新为您计算机上的路径(您需要具有管理员权限),然后graphviz应该可以与pydotplus一起使用。
示例: # Just in case, try the default... path = r"C:\Program Files (x86)\Graphviz2.38\bin"

1

以下是我为上述问题所做的内容。 我正在使用Windows 10操作系统和Python 3.6.5

  1. 通过点击此处安装PIP

  2. 打开命令提示符并输入命令“pip install graphviz”

  3. 在我的电脑(此电脑)中使用关键字“graphviz”进行搜索

  4. 打开Graphviz文件夹,复制其路径并保存在记事本中

  5. 在Graphviz中查找bin文件夹,并通过鼠标右键单击复制该文件夹

  6. 现在再次返回到我的计算机并搜索“pydotplus”

  7. 显示名为pydotplus的文件夹。 打开它并粘贴您之前复制的Graphviz的bin文件夹的副本

  8. 转到控制面板>系统和安全>系统设置>高级设置>环境变量>添加新路径

  9. 添加您在记事本中复制的路径,然后单击一系列“确定”

那就是了,现在你可以享受使用Graphviz了


有人知道为什么我的Graphviz文件夹里没有bin文件夹吗?只有__pycache__和.py文件。 - Supamee

1
我正在运行Windows 10机器,也遇到了一些问题。 我通过msi安装程序安装了graphviz。通过系统设置添加未能成功。
我使用chocolatey,一个Windows软件包管理器,卸载了msi安装的版本。必须先卸载已安装的版本,否则chocolatey无法安装。
现在它运行良好。我建议您按此方法操作。

1

1
在“pydot.py”中(位于...\Anaconda3\Lib\site-packages),将以下内容替换为:
def get_executable_extension():
    # type: () -> str
    if is_windows():
        return '.bat' if is_anacoda() else '.exe'
    else:
        return ''

with:

def get_executable_extension():
    # type: () -> str
    if is_windows():
        return '.exe'
    else:
        return ''

在系统为"Windows/Anaconda"与"Windows"时,似乎没有添加".bat"的必要,并且可能没有将".bat"与".exe"相关联。这似乎比为pydot调用的每个可执行文件添加一个".bat"更好...

这对我很有效,还需要另一个步骤:将包含dot.exe可执行文件的文件夹添加到路径变量中。 - Huanfa Chen

0

如果您不想处理路径变量(例如,如果您不是管理员),并且如果您正在使用Windows,则可以执行以下操作,这对我解决了问题。

在编辑器中打开graphviz.py(可能位于...Anaconda\pkgs\graphviz***\Library\bin)。如果找不到它,您可以通过错误消息打开它。

转到函数__find_executables并替换:

elif os.path.exists(os.path.join(path, prg + '.exe')):
   if was_quoted:
      progs[prg] = '"' + os.path.join(path, prg + '.exe') + '"'
   else:
      progs[prg] = os.path.join(path, prg + '.exe')

使用

elif os.path.exists(os.path.join(path, prg + '.bat')):
   if was_quoted:
      progs[prg] = '"' + os.path.join(path, prg + '.bat') + '"'
   else:
      progs[prg] = os.path.join(path, prg + '.bat')

0

你可以使用pydotplus代替pydot,然后按照以下步骤进行操作:

首先,找到 C:\Users\zhangqianyuan\AppData\Local\Programs\Python\Python36\Lib\site-packages\pydotplus

其次,打开 graphviz.py

第三步,在代码的1925行至1972行之间找到函数 def create(self, prog=None, format='ps'):

最后,在该函数中进行操作即可。

  1. 查找:

    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])
        )
    
  2. 在这两个代码块之间添加以下内容(您的Graphviz可执行文件路径):

    self.progs[prog] = "C:/Program Files (x86)/Graphviz2.38/bin/gvedit.exe"

  3. 添加后的结果为:

    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])
        )
    
  4. 保存更改后,您就可以成功运行它了。

  5. 最好将其保存为bmp文件,因为png文件无法正常工作。 picture is here


为什么会得到相同的答案两次?https://dev59.com/tV4c5IYBdhLWcg3wHHCY#55507373(即双重维护),更好地交叉链接到其他答案。 - albert

0

我遇到了这个问题,并注意到我的PATH带有两组双引号。我通过在第1959行添加以下内容来解决这个问题:

C:\Anaconda\Lib\site-packages\pydot.py

self.progs[prog] = os.path.normpath(self.progs[prog][1:-1])

显然不是最好的解决方案,但它让我度过了这一天。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接