Я пытаюсь установить pygraphviz на Windows 10. Есть много решений этой проблемы в Интернете, но ни один еще не работал для меня. Точная проблема у меня с этим с помощью Jupyter notebook-->
(1) Обычная установка pip: "pip install pygraphviz" Это ошибка, которую я получаю в конце. ОБНОВЛЕНИЕ Я получаю ту же ошибку, даже если я запускаю cmd от имени администратора.
(2) Загрузка и установка graphviz-2.38.msi, а затем загрузка обеих 64-битных версий колеса. Это результат.
Отредактируйте setup.py. Я много читал о людях, которые находят решения в изменении путей, но я не совсем уверен, как это сделать. Этот метод выглядит очень сложным.
Ответ 2
Обновлен репозиторий: [GitHub]: CristiFati/Prebuilt-Binaries - (мастер) Prebuilt-Binaries/Windows/PyGraphviz.
Добавлены .whls(win_amd64, win32) для Python:
Для Python 2.7 они уже созданы: [UCI.LFD]: неофициальные двоичные файлы Windows для пакетов расширений Python - PyGraphviz, интерфейс к пакету макетов и визуализации Graphviz. ,
Примечания:
- В некоторых (я полагаю, в большинстве) случаях установка Graphviz потребуется в системе, где работает PyGraphviz, поскольку PyGraphviz использует некоторые инструменты Graphviz (исполняемые файлы). Они могут быть загружены или построены (они не должны соответствовать архитектуре PyGraphviz (32-разрядная, 64-разрядная), поскольку они вызываются)
- Также была исправлена ошибка (присутствует в предыдущих версиях)
- Проверьте [SO]: pygraphviz 1.5 по умолчанию край без стрелки? (@CristiFati ответ) для более подробной информации
Любой, кто хочет узнать больше деталей о процессе сборки, читайте дальше !
1. Введение
Почти 2 года спустя, и проблема (ну, не совсем так, как в вопросе) все еще сохраняется.
Я хочу начать с подчеркивания различий между двумя пакетами:
В среде Anaconda [SO]: установка PyGraphviz в 64-битной Windows 10, Python 3.6 (ответ @TomHanks) работает отлично.
pygraphwiz имеет только доступный для скачивания файл архива (в данном случае -.zip), то есть он содержит (C/C++) источники.
Несколько слов о пакетах (.whls), имена которых содержат такие вещи, как cp34-none-win_amd64 (проверьте [SO]: что означает название версии "cp27" или "cp35" в Python? (Ответ @WayneWerner) для деталей):
- Они содержат двоичные файлы (.so или .pyd(.dll)), которые связаны с определенной библиотекой Python.
- Они предназначены для работы только с этой версией Python (поэтому 34 не предназначен для работы с Python 3.6)
- Даже если кто-то как-то "перехитрит" пип и сможет установить такой пакет (на самом деле это не так сложно), он потерпит неудачу во время импорта, или, что еще хуже, он имеет высокую вероятность сбоя Python
Теперь во многих пакетах есть встроенные двоичные файлы для большинства распространенных версий Python, работающих в различных ОС (например, [PyPI]: mysql-connector-python - Download files), но так же, как и во многих других, они содержат только исходные коды. К сожалению, PyGraphviz находится во 2- й категории. Для последних, pip install
будет:
- Скачать исходники
- Создавайте источники локально
- Переменный ток (C++) компилятор требуется, как правило,:
- GCC на Nix
- VStudio on Win
- Они могут иметь другие зависимости
- Установите встроенные артефакты (двоичные файлы и файлы .py(c))
В качестве примечания: pip -v...
включает подробный режим для текущей команды, что очень удобно при ошибках установки.
Возвращаясь к нашей проблеме: для Python 3.6 требуется VStudio 2015 ([Python.Wiki]: WindowsCompilers).
Это очень обширная тема, я рассмотрел несколько частей:
Вы должны проверить их, прежде чем продолжить, а также оставить их открытыми, так как они вам обязательно понадобятся на следующих шагах.
У меня установлено Сообщество VStudio 2015 (среди многих других версий), вы должны установить его тоже бесплатно ([MS.VStudio]: все еще хотите старую версию?).
PyGraphviz зависит от [Graphviz]: Программное обеспечение для визуализации графиков. Таким образом, во время сборки необходимо будет (части) Graphviz (который также имеет свои собственные зависимости) быть уже собранным. К сожалению, я не смог найти готовые двоичные файлы (есть [Graphviz]: Windows Packages - graphviz-2.38.zip, но это не помогает), поэтому его придется собирать вручную.
Прежде чем идти дальше:
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" -c "import pygraphviz"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'pygraphviz'
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> dir /b
other
src
Это мой главный каталог, все источники загружаются в каталог src, двоичные файлы будут помещены в каталог bin.
2. Построить Графвиз
Прежде чем начать, я хочу упомянуть, что я сильно полагаюсь на Cygwin (вам не нужно), и некоторые из моих инструментов установлены там, поэтому я буду переключаться между терминалами Cygwin и cmd (что может сбивать с толку).
[Graphviz]: Инструкция по сборке Graphviz для Windows гласит:
Для сборки на Windows:
(Версии Graphviz ≥ 2,41)
Сначала в корне хранилища выполните обновление подмодуля git --init. Это загрузит все подмодули, которые в основном являются зависимостями для сборки Windows. Затем добавьте каталог Windows\dependencies\graphviz-build-utilities в вашу переменную PATH (и перезапустите Visual Studio или приглашение, с помощью которого вы выполните msbuild после этого). Эта папка содержит инструменты Bison, Flex и SED (и будущие дополнения) с проверенными версиями. Если все прошло правильно, теперь зависимости установлены, и вы можете построить Graphviz.
Для начала нам нужно скачать все:
[[email protected]:/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz]> git clone https://gitlab.com/graphviz/graphviz.git .
Cloning into '.'...
remote: Enumerating objects: 71728, done.
remote: Counting objects: 100% (71728/71728), done.
remote: Compressing objects: 100% (19331/19331), done.
remote: Total 71728 (delta 52200), reused 71681 (delta 52157)
Receiving objects: 100% (71728/71728), 163.79 MiB | 480.00 KiB/s, done.
Resolving deltas: 100% (52200/52200), done.
Checking out files: 100% (3870/3870), done.
[[email protected]:/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz]> git submodule update --init
Submodule 'dependencies/criterion' (https://github.com/Snaipe/Criterion.git) registered for path 'dependencies/criterion'
Submodule 'windows/dependencies/graphviz-build-utilities' (https://github.com/ErwinJanssen/graphviz-build-utilities.git) registered for path 'windows/dependencies/graphviz-build-utilities'
Submodule 'windows/dependencies/libraries' (https://github.com/ErwinJanssen/graphviz-windows-dependencies.git) registered for path 'windows/dependencies/libraries'
Cloning into '/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz/dependencies/criterion'...
Cloning into '/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz/windows/dependencies/graphviz-build-utilities'...
Cloning into '/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz/windows/dependencies/libraries'...
Submodule path 'dependencies/criterion': checked out '301d143ea42c024f22b673b69c72a4cb3c8d151f'
Submodule path 'windows/dependencies/graphviz-build-utilities': checked out '050fff84ce195e0740878748760fd801eeb07b23'
Submodule path 'windows/dependencies/libraries': checked out '141d3a21be904fa8dc2ae3ed01d36684db07a35d'
[[email protected]:/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz]> git show head
commit 89292b5945933b1501293c04894ed9cf886241be (HEAD -> master, origin/master, origin/HEAD)
Merge: 429d43615 97811bd35
Author: Stephen C North <[email protected]>
Date: Mon Feb 4 08:09:40 2019 -0500
Merge branch 'wasbridge/graphviz-master' into HEAD
[[email protected]:/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz]> git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
В итоге вы получите каталог, который содержит ~ 320 МБ материала. Каталог содержит файл graphviz.sln, который является файлом решения VStudio (2015) и содержит 63 проекта.
Если посмотреть на пакет Pygraphviz Anaconda или Python 2.7 (встроенный), то он зависит только от cgraph.dll, который, в свою очередь, зависит от cdt.dll, поэтому для нас важны только 2 проекта. Обратите внимание, что эти 2 проекта могут не нуждаться во всех подмодулях git (поэтому каталог может быть обрезан), но я не стал исследовать дальше.
К сожалению, проекты настроены только на 32 бит (платформа Win32). 64-битный должен быть добавлен вручную (я сделал это из VStudio IDE - и также описал процесс в одном из моих ответов, на которые я ссылался). После сохранения проектов они будут показаны как измененные git:
[[email protected]:/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz]> git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)
modified: lib/cdt/cdt.vcxproj
modified: lib/cgraph/cgraph.vcxproj
modified: windows/dependencies/graphviz-build-utilities (modified content)
no changes added to commit (use "git add" and/or "git commit -a")
3- й пункт, потому что мне нужно было сбросить некоторые разрешения безопасности для 2 исполняемых файлов (используется при сборке cgraph):
которые были установлены неправильно (скорее всего, из-за Cygwin).
Вы можете построить 2 проекта из IDE, но я выбрал командную строку ([Ms.Docs]: ссылка на командную строку MSBuild), так как считаю ее более гибкой:
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> "c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x64
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> set PATH=%PATH%;%CD%\src\graphviz\windows\dependencies\graphviz-build-utilities
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> msbuild src\graphviz\lib\cdt\cdt.vcxproj /t:Rebuild /p:Platform=x64;Configuration=Release;SolutionDir=%CD%\src\graphviz\;OutDir=%CD%\bin\Win\dynamic\064\UCRTv140\md\Release\graphviz\ >build_cdt_064.txt 2>&1
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> echo %errorlevel%
0
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> dir /b
bin
build_cdt.txt
other
src
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> msbuild src\graphviz\lib\cgraph\cgraph.vcxproj /t:Rebuild /p:Platform=x64;Configuration=Release;SolutionDir=%CD%\src\graphviz\;OutDir=%CD%\bin\Win\dynamic\064\UCRTv140\md\Release\graphviz\ >build_cgraph_064.txt 2>&1
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> echo %errorlevel%
0
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> dir /b "bin\Win\dynamic\064\UCRTv140\md\Release\graphviz"
cdt.dll
cdt.dll.lastcodeanalysissucceeded
cdt.exp
cdt.lib
cgraph.dll
cgraph.dll.lastcodeanalysissucceeded
cgraph.exp
cgraph.lib
Итак, у нас есть все необходимое (2.lib и 2.dll файла) для продолжения.
3. Сборка PyGraphviz
Исходники PyGraphviz (скачаны с [GitHub]: pygraphviz/pygraphviz - (pygraphviz-1.5) pygraphviz-pygraphviz-1.5.zip и) распакованы в src/pygraphviz/pygraphviz-pygraphviz-1.5.
Еще одна настройка необходима для Graphviz (вероятно, это было сделано в рамках другого проекта - шаг установки): подготовка заголовочных файлов:
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> mkdir include\graphviz
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> copy src\graphviz\lib\cdt\cdt.h include\graphviz
1 file(s) copied.
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> copy src\graphviz\lib\cgraph\cgraph.h include\graphviz
1 file(s) copied.
К сожалению, PyGraphviz не создает OOTB из-за [GitHub]: pygraphviz/pygraphviz - поддержка Python 3. Чтобы это исправить, [GitHub]: eendebakpt/pygraphviz - Обходной путь для PyIOBase_Type для Python2 при победе должен быть применен. Я адаптировал его для работы с текущими источниками (так как он также не работает OOTB: X() только для graphviz_wrap.cpp:
pygraphviz-1,5-все-pyiobase_b85d12ac22d39063f7dbcc396e825c563431e352.patch:
--- pygraphviz/graphviz_wrap.c.orig 2018-09-10 16:07:12.000000000 +0300
+++ pygraphviz/graphviz_wrap.c 2019-02-26 18:05:20.281741400 +0200
@@ -2988,7 +2988,18 @@
#if PY_VERSION_HEX >= 0x03000000
-extern PyTypeObject PyIOBase_Type;
+static PyObject *PyIOBase_TypeObj;
+
+static int init_file_emulator(void)
+{
+ PyObject *io = PyImport_ImportModule("_io");
+ if (io == NULL)
+ return -1;
+ PyIOBase_TypeObj = PyObject_GetAttrString(io, "_IOBase");
+ if (PyIOBase_TypeObj == NULL)
+ return -1;
+ return 0;
+}
#endif
@@ -3449,7 +3460,7 @@
{
#if PY_VERSION_HEX >= 0x03000000 || defined(PYPY_VERSION)
#if !defined(PYPY_VERSION)
- if (!PyObject_IsInstance(obj0, (PyObject *)&PyIOBase_Type)) {
+ if (!PyObject_IsInstance(obj0, PyIOBase_TypeObj)) {
PyErr_SetString(PyExc_TypeError, "not a file handle");
return NULL;
}
@@ -3523,7 +3534,7 @@
{
#if PY_VERSION_HEX >= 0x03000000 || defined(PYPY_VERSION)
#if !defined(PYPY_VERSION)
- if (!PyObject_IsInstance(obj1, (PyObject *)&PyIOBase_Type)) {
+ if (!PyObject_IsInstance(obj1, PyIOBase_TypeObj)) {
PyErr_SetString(PyExc_TypeError, "not a file handle");
return NULL;
}
@@ -6051,6 +6062,12 @@
SWIG_InstallConstants(d,swig_const_table);
+#if PY_VERSION_HEX >= 0x03000000
+ if (init_file_emulator() < 0) {
+ return NULL;
+ }
+#endif
+
PyDict_SetItemString(md,(char*)"cvar", SWIG_globals());
SWIG_addvarlink(SWIG_globals(),(char*)"Agdirected",Swig_var_Agdirected_get, Swig_var_Agdirected_set);
SWIG_addvarlink(SWIG_globals(),(char*)"Agstrictdirected",Swig_var_Agstrictdirected_get, Swig_var_Agstrictdirected_set);
Это разница (патч). См. [SO]: запускать/отлаживать UnitTests приложения Django из контекстного меню, вызываемого правой кнопкой мыши, в PyCharm Community Edition? (Ответ @CristiFati) (раздел " Патч на utrunner ") о том, как применять патчи на Win (в основном, каждая строка, начинающаяся с одного знака "+", вводится, а каждая строка, начинающаяся с одного знака "-", исчезает).
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> set _TOP_DIR=%CD%
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> pushd src\pygraphviz\pygraphviz-pygraphviz-1.5
[[email protected]:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> pushd pygraphviz && "c:\Install\x64\Cygwin\Cygwin\AllVers\bin\patch.exe" -p 1 -buNi ..\pygraphviz-1.5-all-pyiobase_b85d12ac22d39063f7dbcc396e825c563431e352.patch && popd
patching file graphviz_wrap.c
[[email protected]:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> echo %errorlevel%
0
[[email protected]:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" setup.py install --include-path=%_TOP_DIR%\include --library-path=%_TOP_DIR%\bin\Win\dynamic\064\UCRTv140\md\Release\graphviz >%_TOP_DIR%\install_pygraphviz_064.txt 2>&1
[[email protected]:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> echo %errorlevel%
0
[[email protected]:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> popd
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> set PATH=%PATH%;%CD%\bin\Win\dynamic\064\UCRTv140\md\Release\graphviz
[[email protected]:e:\Work\Dev\StackOverflow\q045093811]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" -c "import pygraphviz;print(dir(pygraphviz), \"\n\", pygraphviz.graphviz._graphviz)"
['AGraph', 'Attribute', 'DotError', 'Edge', 'ItemAttribute', 'Node', '__all__', '__author__', '__builtins__', '__cached__', '__date__', '__doc__', '__file__', '__license__', '__loader__', '__name__', '__package__', '__path__', '__revision__', '__spec__', '__version__', 'absolute_import', 'agraph', 'division', 'graphviz', 'print_function', 'release', 'test', 'tests', 'version']
<module '_graphviz' (e:\Work\Dev\VEnvs\py_064_03.06.08_test0\lib\site-packages\pygraphviz\_graphviz.cp36-win_amd64.pyd)>
Как видно, модуль был успешно импортирован.
Как примечание, 2.dll-зависимости (из предыдущего раздела) должны быть доступны при импорте модуля, поэтому их каталог добавляется в% PATH%.
Конечно, это всего лишь (отсталый) обходной путь (Gainarie), это не должно происходить каждый раз, когда приходится работать с пакетом.
Я не знаю (пока), как дать команду setup.py также скопировать их в каталог build/install пакета, поэтому в качестве альтернативы (также обходного пути) нужно вручную скопировать их в каталог установки pygraphviz (рядом с _graphviz.cp36). -win_amd64.pyd, который (в моем случае): "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\lib\site-packages\pygraphviz").
4. Ярлык
Поскольку весь процесс сложен и требует много ручных вмешательств и взломов, мне удалось собрать (с небольшими изменениями setup.py) пакет (wheel).
Я не знаю простого способа сделать его общедоступным, поэтому (хотя я знаю, что это плохая практика) я загрузил его на [GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/Windows/PyGraphviz/pygraphviz-1.5-cp36-cp36m-win_amd64.whl.
Вы можете скачать его, а затем установить как (это один из способов):
"C:\Path\to\Python-3.6-amd64\pip" install "C:\Path\to\downloaded\pygraphviz-1.5-cp36-cp36m-win_amd64.whl"
Примечание: это работает и для сред Anaconda!