如何在 Windows 上从 pygraphviz 运行neato

Posted

技术标签:

【中文标题】如何在 Windows 上从 pygraphviz 运行neato【英文标题】:How to run neato from pygraphviz on Windows 【发布时间】:2013-01-18 17:18:41 【问题描述】:

我正在尝试在 python (v 2.7) 中使用 pygraphviz 和 networkx 来创建网络图。我发现了一个在 *** 上看起来非常有用的脚本:

import networkx as nx
import numpy as np
import string
import pygraphviz

dt = [('len', float)]
A = np.array([(0, 0.3, 0.4, 0.7),
               (0.3, 0, 0.9, 0.2),
               (0.4, 0.9, 0, 0.1),
               (0.7, 0.2, 0.1, 0)
               ])*10
A = A.view(dt)

G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),string.ascii_uppercase)))    

G = nx.to_agraph(G)

G.node_attr.update(color="red", style="filled")
G.edge_attr.update(color="blue", )

G.draw('/tmp/out.png', format='png', prog='neato')

最后一行报错,基本上找不到neato:

“ValueError:路径中找不到程序neato。”

错误是指pygraphviz 的 agraph.py 文件,但是当我查看 agraph.py 时,我看不到任何可能导致问题的内容

任何想法如何解决这个问题?我正在使用 windows 和 IDLE 进行编码。 谢谢!

【问题讨论】:

我在 WSL 2 中也有这个错误。 【参考方案1】:

尝试这样的事情,看看 pygraphviz 认为你的外部程序在哪里:

# Get paths of graphviz programs
import pygraphviz as pgv

A = pgv.AGraph()
progs_list = ['neato', 'dot', 'twopi', 'circo', 'fdp', 'nop', 'wc', 'acyclic', 'gvpr',
              'gvcolor', 'ccomps', 'sccmap', 'tred', 'sfdp', 'unflatten']
for prog in progs_list:
    try:
        runprog = A._get_prog(prog)
        print(f'runprog')
    except ValueError as e:
        print(f'prog gets this error: str(e).strip()')

查看结果后,在您的 IDE 之外安装 Graphviz 并在系统控制面板中设置您的 Path 环境变量等工作很多。

【讨论】:

【参考方案2】:

导致此错误的原因可能不止一个,但如果它是由缺少 graphviz 模块 [neato,dot,twopi,circo,fdp,nop] 的路径引起的,那么有一个 hack 对我有用。我目前在问正确的解决方案是什么,但你可以使用这个

if  not 'C:\\Program Files (x86)\\Graphviz2.38\\bin' in os.environ["PATH"]: 
    os.environ["PATH"] += os.pathsep + 'C:\\Program Files (x86)\\Graphviz2.38\\bin' 

在脚本的开头。概括地说,如果您的 graphviz 文件保存在其他地方:

graph_path='your_bin_folder_path'
    if  not graph_path in os.environ["PATH"]: 
        os.environ["PATH"] += os.pathsep + graph_path

这尤其适用于 Windows 10,使用 anaconda navigator 和 python 3.7 版。

【讨论】:

既然您声明我的答案对您不起作用:您是否在设置路径变量后关闭并重新打开终端,就像我描述的那样?因为这是一个人需要做的事情,但如果你这样做了,我也不知道 哦,这可能就是我所需要的。【参考方案3】:

您的问题是缺少neatoneato 是您可以在 PC 上安装的 graphviz 套件的一部分,例如来自here。 (我用的是.msi

现在,neato 已“安装”,但您的系统不知道在哪里。因此,将包含neato.exe 的目录添加到您的PATH 环境变量中。在 Win10 上,这可以通过 Start -> Edit environment variables for your account -> select path in the upper window -> edit -> New -> C:\Program Files (x86)\Graphviz2.38\bin\ 完成 或者你的安装目录是什么。

【讨论】:

这个答案一般来说真的很好。基本想法对我来说是正确的,但出于某种原因,将这条路径添加到了 Env。瓦尔斯。没用。我也会发布我的解决方案。【参考方案4】:

我遇到了同样的问题。如果其他人正在努力让 pygraphvis 在 Windows 上运行,这是我所做的。

首先,我安装了graphviz。我试图通过 pip 安装 pygraphvis,但它拒绝工作。最终,我找到了非官方的 Windows 二进制文件,所以我安装了它。现在可以导入模块,但是调用G.layout() 导致出现上述错误。

调用neato -V 有效,所以它在我的路径上。我发现问题在于 python 在安装 pygraphvis 之前创建的命令提示符中运行,因此 PATH 没有更新。重新启动命令提示符解决了这个问题,但导致了一个新错误,关于 C:\Program 不是一个有效的命令。

我认为 pygraphvis 可能无法正确引用路径,这意味着它会在 Program Files 中的空间处截断。我通过将其符号链接到没有空格的路径解决了这个问题。

mklink /d C:\ProgramFilesx86 "C:\Program Files (x86)"

请注意,这必须在管理员模式下运行。您可以通过转到开始菜单,输入 cmd,然后按 Ctrl+shift+enter 来完成。

在此之后,我编辑了我的 PATH 以引用符号链接,重新启动 cmd,一切正常。

【讨论】:

为了清楚起见,现在很难在 windows10 中访问“路径”。要访问它,请右键单击开始按钮(左下角),然后单击“搜索”,然后输入“控制面板”,然后单击窗口右侧的“系统”,然后单击左侧的窗口点击“高级系统参数”。更改路径后,记得关闭并再次打开 python 和命令提示符以更新更改的路径。【参考方案5】:

问题在于 pygraphviz 调用了一个外部程序,该程序是 graphviz 套件的一部分,名为 neato,来绘制图形。发生的事情是您没有安装 graphviz 并且当 python 尝试调用它时它抱怨找不到它。实际上 pygraphviz 只是一个包装器,它使您可以从 python 内部调用 graphviz,但它本身并没有做任何事情,并且默认情况下不会安装 graphviz。

最简单的解决方案是为情节尝试不同的解决方案,而不是使用neato。接受的选项是:

neato
dot
twopi
circo
fdp
nop

尝试其中一种,看看其中一种是否有效。否则,您可以安装 graphviz,它将为您提供所需的程序。它是每个平台上都可用的开源程序,因此安装它应该不是问题。

见http://www.graphviz.org/

如果您只需要绘制图形草图,可以在 networkx 图形上使用 networkx.draw 函数,该函数使用 matplotlib 创建交互式绘图。

import networkx as nx
G = G=nx.from_numpy_matrix(A)
nx.draw(G)

【讨论】:

首先,感谢您的回复。我确实安装了graphviz。现在,当我运行我的脚本时,我得到了这个错误: Traceback (last recent call last): File "C:/Python27/2_5.py", line 22, in G.draw('/tmp/out.png ', format='png', prog='neato') 文件“C:\Python27\lib\site-packages\pygraphviz\agraph.py”,第 1422 行,在 draw fh=self._get_fh(path,'w+ b') 文件“C:\Python27\lib\site-packages\pygraphviz\agraph.py”,第 1458 行,在 _get_fh fh = file(path,mode=mode) IOError: [Errno 2] No such file or directory: '/tmp/out.png' 创建文件 /tmp/out.png 时出现问题。这可能与操作系统有关。 /tmp 是所有 linux 发行版中的普通目录,因此只需要创建 tha 文件。如果您在 Windows 上工作,该目录可能不存在,因此会出现错误(您试图在不存在的目录中创建文件)。如果您只用"out.png" 替换它而不指定目录,它应该在当前目录中创建它而不会抱怨。让我知道这是否有效! 现在,如果还知道如何使用这些其他选项,那就太好了。

以上是关于如何在 Windows 上从 pygraphviz 运行neato的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上安装 pygraphviz

在 Windows 10 64 位、Python 3.6 上安装 pygraphviz

在Windows 10 64位,Python 3.6上安装pygraphviz

2 pygraphviz在windows10 64位下的安装问题(反斜杠的血案)

windows下怎么安装pygraphviz?请各位帮帮忙

Pygraphviz 在绘制 170 个图后崩溃