Как запустить neato из pygraphviz на Windows

Я пытаюсь использовать pygraphviz и networkx в python (v 2.7) для создания карты сети. Я нашел скрипт, который выглядит очень полезным для stackru:

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: Программа не обнаружена в пути."

Ошибка относится к файлу agraph.py для pygraphviz, но я не вижу ничего, что могло бы вызвать проблему, когда я просматриваю agraph.py

Есть идеи, как решить эту проблему? Я использую окна и IDLE для моего кодирования. Спасибо!

5 ответов

У меня такая же проблема. Вот что я сделал в случае, если кто-то еще пытается заставить Pygraphvis работать на Windows.

Во-первых, я установил графвиз. Я попытался установить 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, и все заработало.

Проблема состоит в том, что pygraphviz вызывает внешнюю программу, часть набора графов, называемую neato, для рисования графа. Происходит то, что у вас не установлен graphviz, и когда python пытается вызвать его, он жалуется, что не нашел его. На самом деле pygraphviz - это просто оболочка, которая дает вам возможность вызывать graphviz изнутри python, но сама по себе ничего не делает и по умолчанию не устанавливает graphviz.

Самое простое решение - попробовать другое решение вместо сюжета. Принимаются следующие варианты:

neato
dot
twopi
circo
fdp
nop

попробуйте один из них и посмотрите, работает ли один из них. В противном случае вы можете установить graphviz, который даст вам необходимую программу. Это и программа с открытым исходным кодом, доступная на любой платформе, поэтому ее не должно быть проблемой.

см. на http://www.graphviz.org/

Если вам просто нужен эскиз графика, вы можете использовать функцию networkx.draw на графике networkx, которая использует matplotlib для создания интерактивного графика.

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

Ваша проблема в том, что neato пропал, отсутствует.
neato является частью пакета graphviz, который вы можете установить на свой компьютер, например, отсюда. (Я использовал .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\ или любой другой каталог для установки.

Вероятно, у этой ошибки есть несколько причин, но если она вызвана отсутствующим путем к модулям 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.

Попробуйте что-нибудь подобное, чтобы узнать, где, по мнению 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 на панели управления системой и т. Д.

Другие вопросы по тегам