如何在Windows上运行来自pygraphviz的neato

时间:2013-02-04 01:50:51

标签: python-2.7 neato pygraphviz

我正在尝试在python(v 2.7)中使用pygraphviz和networkx来创建网络映射。我找到了一个在stackoverflow上看起来非常有用的脚本:

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", width="2.0")

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

我在最后一行收到错误,基本上找不到neato:

  

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

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

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

5 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。这就是我所做的,以防其他任何人努力让pygraphvis在Windows上运行。

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

调用neato -V有效,所以它在我的PATH上。我发现问题是python是在安装pygraphvis之前创建的命令提示符下运行的,所以PATH没有更新。重新启动命令提示符修复此问题,但导致出现新错误,即C:\Program不是有效命令。

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

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

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

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

答案 1 :(得分:1)

问题是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)

答案 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 环境变量等工作量很大。

答案 3 :(得分:0)

您的问题是缺少__psynch_mutexwait
neato是graphviz套件的一部分,您可以将其安装在PC上,例如来自here。 (我使用了neato

现在neato已“安装”,但是您的系统不知道在哪里。因此,将包含.msi的目录添加到neato.exe环境变量中。在Win10上,可以使用PATH完成此操作  或任何您的安装目录。

答案 4 :(得分:0)

造成此错误的原因可能不止一种,但如果是由于graphviz模块[neato,dot,twopi,circo,fdp,nop]缺少路径所致,那么有一种对我有用的技巧。我目前正在问什么是正确的解决方案,但是您可以使用此

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导航器和python版本3.7起作用。