Обновлен репо: [GitHub]: CristiFati / Prebuilt-Binaries - (master) Prebuilt-Binaries / PyGraphviz / v1.5:
- Использование официальных источников Graphviz 2.42.2
- .whl s (win_amd64, win32) для поддерживаемых в настоящее время версий Python
- Могут быть добавлены более новые версии (проверьте на один уровень выше)
Для Python 2.7 они уже созданы: [UCI .LFD]: неофициальные двоичные файлы Windows для пакетов расширений Python - PyGraphviz, интерфейс к пакету компоновки и визуализации графа Graphviz..
Примечания:
- In some (I guess, most of the) cases, a Graphviz installation will be required on the system where PyGraphviz runs on, because PyGraphviz uses some of Graphviz's tools (executables). They can be downloaded, or built (they don't have to match PyGraphviz architecture (32bit, 64bit), as they are invoked).
Update: I also added Graphviz 2.42.2 build (32bit - as it works on both 64bit and 32bit Win) in the above repository
- Check it for newer software versions
- Также была исправлена ошибка (присутствовавшая в предыдущих версиях). Отметьте [SO]: край по умолчанию pygraphviz 1.5 без стрелки? (Ответ @ CristiFati) для получения более подробной информации.
Всем, кто хочет узнать больше о процессе сборки, читайте!
1. Введение
Спустя почти 2 года проблема (ну не совсем так, как в вопросе) все еще сохраняется.
Я хочу начать с того, что подчеркну разницу между двумя пакетами:
В среде Anaconda [SO]: установка PyGraphviz в 64-разрядной версии Windows 10, Python 3.6 (ответ @ TomHanks) работает отлично.
pygraphwiz доступен для загрузки только в виде файла архива (.zip, в данном случае), что означает, что он содержит (C / C ++ ) исходники.
Пару слов о пакетах (.whl), имена которых содержат такие вещи, как cp34-none-win_amd64 (отметьте [SO]: Что означает имя версии 'cp27' или 'cp35 'означает в Python? (ответ @ WayneWerner) для подробностей):
- They contain binaries (.so or .pyd (.dll)), which are linked against a specific Python library
- They are meant to work only with that Python version (so 34 is not meant to work with Python 3.6)
- Даже если кто-то каким-то образом перехитрит pip и ему удастся установить такой пакет (на самом деле это не так уж сложно), он выйдет из строя во время импорта или, что еще хуже, он имеет высокую вероятность сбоя Python
Сейчас многие пакеты содержат предварительно созданные двоичные файлы для наиболее распространенных версий Python, работающих в различных ОС (например, [PyPI]: mysql-connector-python - Загрузить файлы), но многие из них этого не делают, и они содержат только исходные коды. К сожалению, PyGraphviz находится во второй ой категории. В отношении последних pip install
будет:
- Скачать исходники
- Build the sources locally
- A C (C++) compiler is required, typically:
- У них могут быть другие зависимости
- Установите встроенные артефакты (двоичные файлы и файлы .py (c))
В качестве примечания: pip -v ...
включает подробный режим для текущей команды, что очень удобно при возникновении ошибок установки.
Вернемся к нашей проблеме: Python 3.6 требует VStudio 2015 ([Python.Wiki]: WindowsCompilers).
Это очень обширная тема, некоторые части я рассмотрел в:
Вы должны проверить их, прежде чем продолжить, и также держать их открытыми, так как они вам обязательно понадобятся на следующих этапах.
У меня установлено VStudio 2015 Community (среди многих других версий), вы тоже должны установить его, это бесплатно ([MS.VStudio]: все еще хотите более старую версию?).
PyGraphviz зависит от [Graphviz]: программного обеспечения для визуализации графиков. Таким образом, во время сборки ему потребуется (части) Graphviz (который также имеет свои собственные зависимости), которые уже будут построены. К сожалению, я не смог найти готовые двоичные файлы (есть [Graphviz]: Пакеты Windows - graphviz-2.38.zip, но это не помогает), поэтому его придется собирать вручную.
Прежде чем идти дальше:
[cfati@CFATI-5510-0: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'
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> dir /b
other
src
Это мой верхний каталог, все источники загружаются в каталог src, двоичные файлы будут помещены в bin реж.
2. Создайте Graphviz.
Прежде чем начать, я хочу упомянуть, что я сильно полагаюсь на Cygwin (вам не обязательно), а также на некоторые из моих инструментов там установлены, поэтому я буду чередовать терминалы Cygwin и cmd (что может сбивать с толку).
В [Graphviz]: Инструкции по сборке Graphviz для Windows говорится:
Для сборки в Windows:
(версии Graphviz ≥ 2.41)
Сначала в корне репозитория выполните git submodule update --init. Это загрузит все подмодули, которые в основном являются зависимостями для сборки Windows. Затем добавьте каталог windows \ dependencies \ graphviz-build-utilities в ваш PATH (и перезапустите Visual Studio или приглашение, с которым вы выполняете msbuild после этого). Эта папка содержит инструменты Bison, Flex и SED (и будущие дополнения) с тестируемыми версиями. Если все прошло правильно, зависимости настроены, и вы можете собрать Graphviz.
Для начала нам нужно скачать все:
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q045093811/src/graphviz]> ~/sopr.sh
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
[064bit prompt]> 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.
[064bit prompt]>
[064bit prompt]> 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'
[064bit prompt]>
[064bit prompt]> 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
[064bit prompt]> 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 проектов. .
Если посмотреть на пакет Anaconda или Python 2.7 pygraphviz (встроенный), он зависит только от cgraph.dll, который, в свою очередь, зависит от cdt.dll, поэтому для нас важны только два проекта. Обратите внимание, что этим двум проектам могут не понадобиться все подмодули git (так что каталог может быть урезан), но я не стал исследовать дальше.
К сожалению, проекты настроены только для 32-разрядной (платформа Win32). 64-битный должен быть добавлен вручную (я сделал это из VStudio IDE, а также описал процесс в одном из моих ответов, на который я ссылался ). После сохранения проекты будут отображаться как измененные git:
[064bit prompt]> 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 rd связан с тем, что мне нужно было сбросить некоторые разрешения безопасности для 2 исполняемых файлов (используемых при сборке cgraph):
которые не были установлены должным образом (скорее всего, из-за Cygwin).
Вы можете собрать два проекта из IDE, но я выбрал командную строку ([MS.Docs]: справочник по командной строке MSBuild), поскольку я считаю его более гибким:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
[prompt]> "c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x64
[prompt]> set PATH=%PATH%;%CD%\src\graphviz\windows\dependencies\graphviz-build-utilities
[prompt]> 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
[prompt]> echo %errorlevel%
0
[prompt]> dir /b
bin
build_cdt.txt
other
src
[prompt]> 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
[prompt]> echo %errorlevel%
0
[prompt]> 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 (возможно, это делается как часть другого проекта - на этапе установки): подготовка файлов заголовков:
[prompt]> mkdir include\graphviz
[prompt]> copy src\graphviz\lib\cdt\cdt.h include\graphviz
1 file(s) copied.
[prompt]> copy src\graphviz\lib\cgraph\cgraph.h include\graphviz
1 file(s) copied.
К сожалению, PyGraphviz не создает OOTB из-за [GitHub]: pygraphviz / pygraphviz - Поддержка Python 3. Чтобы исправить это, [GitHub]: eendebakpt / pygraphviz для Python2 - Обходной путь для Python2 - обходной путь > Применять надо. Я адаптировал его для работы с текущими источниками (так как он также не работает OOTB: X () только для graphviz_wrap.cpp :
pygraphviz-1.5-all-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);
Это diff (patch). См. [ SO]: запускать / отлаживать UnitTests приложения Django из контекстного меню, щелкнув правой кнопкой мыши в PyCharm Community Edition? (Ответ @CristiFati) (раздел Установка исправлений utrunner) о том, как применять исправления к Win (в основном, каждая строка, начинающаяся с вводится один знак +, и каждая строка, начинающаяся со знака -, гаснет).
[prompt]> :: Restore the original prompt as cwd is important
[prompt]> exit
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> set _TOP_DIR=%CD%
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> pushd src\pygraphviz\pygraphviz-pygraphviz-1.5
[cfati@CFATI-5510-0: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
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> echo %errorlevel%
0
[cfati@CFATI-5510-0: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
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> echo %errorlevel%
0
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811\src\pygraphviz\pygraphviz-pygraphviz-1.5]> popd
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> set PATH=%PATH%;%CD%\bin\Win\dynamic\064\UCRTv140\md\Release\graphviz
[cfati@CFATI-5510-0: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 также скопировать их в каталог сборки / установки пакета, поэтому в качестве альтернативы (также обходной путь) нужно вручную скопировать их в pygraphviz install dir (рядом с _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 / Py1Graphviz / v .5 / 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!
person
CristiFati
schedule
26.02.2019
Pip install pygraphviz
у меня не работает и на 2.7, и на 3.6. Мне удалось установить 2.7, загрузив файл cp27 whl. Итак, я ищу файл cp34 для python 3. - person jason   schedule 19.02.2019