Как запустить 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 на панели управления системой и т. Д.