在Windows 10 64位,Python 3.6上安装pygraphviz

adu*_*bin 25 python windows pip pygraphviz anaconda

好的,我们在这里......我正在尝试在Windows 10上安装pygraphviz.这个问题在网上有很多解决方案,但还没有一个对我有用.我遇到的确切问题是通过jupyter笔记本 - >

[1] import networkx as nx
import pylab as plt
from networkx.drawing.nx_agraph import graphviz_layout

[2]G = nx.DiGraph()
G.add_node(1,level=1)
G.add_node(2,level=2)
G.add_node(3,level=2)
G.add_node(4,level=3)

G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,4)

nx.draw(G, pos=graphviz_layout(G), node_size=1600, cmap=plt.cm.Blues,
    node_color=range(len(G)),
    prog='dot')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在[2]后我得到以下错误:

ModuleNotFoundError                       Traceback (most recent call last)
C:\Users\name\Anaconda3\lib\site-packages\networkx\drawing\nx_agraph.py 
in 
pygraphviz_layout(G, prog, root, args)
    254     try:
--> 255         import pygraphviz
    256     except ImportError:

ModuleNotFoundError: No module named 'pygraphviz'
Run Code Online (Sandbox Code Playgroud)

ImportError                               Traceback (most recent call last)
<ipython-input-2-86a15892f0f0> in <module>()
  9 G.add_edge(2,4)
 10 
---> 11 nx.draw(G, pos=graphviz_layout(G), node_size=1600, cmap=plt.cm.Blues,
 12         node_color=range(len(G)),
 13         prog='dot')

C:\Users\name\Anaconda3\lib\site-packages\networkx\drawing\nx_agraph.py in graphviz_layout(G, prog, root, args)
226 
227     """
--> 228     return pygraphviz_layout(G,prog=prog,root=root,args=args)
229 
230 def pygraphviz_layout(G,prog='neato',root=None, args=''):

C:\Users\name\Anaconda3\lib\site-packages\networkx\drawing\nx_agraph.py in pygraphviz_layout(G, prog, root, args)
256     except ImportError:
257         raise ImportError('requires pygraphviz ',
--> 258                           'http://pygraphviz.github.io/')
259     if root is not None:
260         args+="-Groot=%s"%root

ImportError: ('requires pygraphviz ', 'http://pygraphviz.github.io/')
Run Code Online (Sandbox Code Playgroud)

这是我试图解决的问题

(1)常规pip安装:"pip install pygraphviz"这是我最后得到的错误.编辑我得到相同的错误,即使我以管理员身份运行cmd.

Command "C:\Users\name\Anaconda3\python.exe -u -c "import setuptools, 
tokenize;__file__='C:\\Users\\name~1\\AppData\\Local\\Temp\\pip-build-
n81lykqs\\pygraphviz\\setup.py';f=getattr(tokenize, 'open', open)
(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, 
__file__, 'exec'))" install --record C:\Users\name~1\AppData\Local\Temp\pip-
b3jz1lk5-record\install-record.txt --single-version-externally-managed --
compile" failed with error code 1 in C:\Users\name~1\AppData\Local\Temp\pip-
build-n81lykqs\pygraphviz\
Run Code Online (Sandbox Code Playgroud)

(2)下载并安装graphviz-2.38.msi,然后下载64位版本的滚轮.这是结果.

C:\Users\name\Anaconda3>pip install pygraphviz-1.3.1-cp34-none-
win_amd64.whl
pygraphviz-1.3.1-cp34-none-win_amd64.whl is not a supported wheel on this 
platform.

C:\Users\name\Anaconda3>pip install pygraphviz-1.3.1-cp27-none-
win_amd64.whl
pygraphviz-1.3.1-cp27-none-win_amd64.whl is not a supported wheel on this 
platform.
Run Code Online (Sandbox Code Playgroud)

我想尝试一下,但不确定如何正确做到:

编辑setup.py.我已经阅读了很多关于人们在改变路径时找到解决方案的内容,但我不确定如何做到这一点.这种方法看起来非常复杂.

感谢您的帮助/见解!

Cri*_*ati 7

更新了存储库:[GitHub]:CristiFati / Prebuilt-Binaries-(主)Prebuilt-Binaries / PyGraphviz / v1.5 / Graphviz-2.42.2(作为URL声明,使用Graphviz官方版本2.42.2)。Python
添加了.whl s(win_amd64win32

  • 3.8
  • 3.7
  • 3.6
  • 3.5

对于Python 2.7,它们已经构建:[UCI.LFD]:用于Python扩展包的非官方Windows二进制文件-PyGraphviz,它是Graphviz图形布局和可视化程序包的接口。

注意事项

  • 在某些情况下(我猜是大多数情况),运行PyGraphviz的系统上将需要安装Graphviz,因为PyGraphviz使用了Graphviz的某些工具(可执行文件)。它们可以下载或构建(在调用它们时不必匹配PyGraphviz体系结构(32bit64bit))
  • 此外,还修复了一个错误(在以前的版本中存在)
  • 检查[SO]:pygraphviz 1.5默认边缘没有箭头?(@CristiFati的答案)以获取更多详细信息

任何想了解有关构建过程的更多细节的人,请继续阅读



1.简介

差不多2年后,问题仍然存在(当然,与问题不完全相同)。

我首先要强调两个软件包之间的区别:

Anaconda环境中,[SO]:在Windows 10 64位上安装PyGraphviz,Python 3.6(@TomHanks的答案) 可以完美运行

pygraphwiz仅可下载一个存档文件(在本例中为.zip),这意味着该文件包含(C / C ++)源。

关于名称包含cp34-none-win_amd64之类的软件包(.whl)的两句话(请检查[SO]:版本名称'cp27'或'cp35'在Python中是什么意思?(@ WayneWerner的答案)) :

  • 它们包含二进制文件(.so.pyd.dll)),这些二进制文件与特定的Python库链接
    • 他们是为了工作,只与Python的版本(所以34不是意味着工作与Python的3.6
    • 即使是以某种方式“精明”的pip并设法安装了这样的软件包(实际上并不难),它将在导入时失败,或更糟糕的是,它很有可能使Python崩溃

现在,许多软件包已经为在各种OS上运行的最常见的Python版本预先构建了二进制文件(例如[PyPI]:mysql-connector-python-下载文件),但很多软件包却没有,并且仅包含源代码。不幸的是,PyGraphviz属于第二类。对于后者,将:pip install

  • 下载资源
  • 在本地构建源
    • ÇC ++)编译器是必需的,通常为:
      • GCC尼克斯
      • VStudioWin
    • 他们可能还有其他依赖性
  • 安装内置的人工制品(二进制文件和.py(c)文件)

附带说明:为当前命令pip -v ...启用详细模式,在遇到安装错误时非常方便

回到我们的问题:Python 3.6需要VStudio 2015[Python.Wiki]:WindowsCompilers)。
这是一个非常广阔的话题,我在以下内容中做了介绍:

您应该在继续操作之前检查它们,并保持打开状态,因为在后续步骤中肯定会需要它们

我已经安装了VStudio 2015社区(在许多其他版本中),您也应该安装它,它是免费的([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
Run Code Online (Sandbox Code Playgroud)

这是我的顶级目录,任何源文件都下载到src目录中,二进制文件将放置在bin目录中。

2.建立Graphviz

在开始之前,我想提一下,我非常依赖Cygwin(您不必这样做),并且我的一些工具已安装在此处,因此我将在Cygwincmd终端之间切换(这可能会造成混淆)。

[Graphviz]:Windows的Graphviz构建说明指出:

在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]> 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.
[cfati@cfati-5510-0:/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'
[cfati@cfati-5510-0:/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 <scnorth@gmail.com>
Date:   Mon Feb 4 08:09:40 2019 -0500

    Merge branch 'wasbridge/graphviz-master' into HEAD

[cfati@cfati-5510-0:/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
Run Code Online (Sandbox Code Playgroud)

您最终将获得一个包含〜320 MiB内容的目录。该目录包含一个graphviz.sln文件,这是一个VStudio(2015)解决方案文件,其中包含63个项目。

查看AnacondaPython 2.7 pygraphviz(内置)程序包,它仅依赖于cgraph.dll,而后者又依赖于cdt.dll,因此只有两个项目与我们相关。请注意,这两个项目可能不需要所有的git子模块(因此目录可能会被删减),但是我没有进一步调查。

不幸的是,项目仅配置为32位Win32平台)。在64位的一个必须手动添加(我做到了从VStudio IDE -也描述的过程中我的答案之一,我引用)。保存项目后,它们将显示为git修改:

[cfati@cfati-5510-0:/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")
Run Code Online (Sandbox Code Playgroud)

3 项目是因为我需要重置2个可执行文件(构建时使用的一些安全权限cgraph):

  • 野牛
  • 脚本

设置不正确(很可能是因为Cygwin)。

您可以从IDE生成2个项目,但是我选择了命令行([Ms.Docs]:MSBuild命令行参考),因为我发现它更灵活:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> "c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x64

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> set PATH=%PATH%;%CD%\src\graphviz\windows\dependencies\graphviz-build-utilities

[cfati@CFATI-5510-0: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

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> echo %errorlevel%
0

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> dir /b
bin
build_cdt.txt
other
src

[cfati@CFATI-5510-0: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

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> echo %errorlevel%
0

[cfati@CFATI-5510-0: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
Run Code Online (Sandbox Code Playgroud)

因此,我们拥有继续进行所需的一切(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进行更多调整(可能是作为另一个项目的一部分- 安装步骤完成):准备头文件:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> mkdir include\graphviz

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> copy src\graphviz\lib\cdt\cdt.h include\graphviz
        1 file(s) copied.

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q045093811]> copy src\graphviz\lib\cgraph\cgraph.h include\graphviz
        1 file(s) copied.
Run Code Online (Sandbox Code Playgroud)

不幸的是,PyGraphviz没有建立开箱即用的,因为[GitHub上]:pygraphviz / pygraphviz - Python 3的支持。为了解决这个问题,[GitHub]:eendebakpt / pygraphviz-Win2上适用于Python2的PyIOBase_Type的解决方法。我对其进行了修改以使其与当前源一起使用(因为它不适用于OOTB,所以对于仅限graphviz_wrap.cpp的:X()也是如此

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);
Run Code Online (Sandbox Code Playgroud)

那是一个diffpatch)。请参见[SO]:从鼠标右键单击PyCharm Community Edition中的上下文菜单运行/调试Django应用程序的UnitTests?(@CristiFati的答案)修补utrunner部分),介绍如何在Win上应用修补程序(基本上,每行以一个“ +”号开头的行都进入,而每行以一个“-”号开头的行都熄灭)。

[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)>
Run Code Online (Sandbox Code Playgroud)

如图所示,模块已成功导入。

请注意,导入模块时2个.dll依赖项(来自上一节)必须可用,因此它们的目录已添加到%PATH%
当然,这只是(lam)解决方法(gainarie),这种情况不会在每次必须使用该软件包时发生。

我不知道(但)如何指导setup.py也他们在包材(变通办法也)复制/安装目录,所以作为替代一个具有手动将其复制pygraphviz安装目录(旁边_graphviz.cp36 -win_amd64.pyd,(在我的情况下):“ e:\ Work \ Dev \ VEnvs \ py_064_03.06.08_test0 \ lib \ site-packages \ pygraphviz”)。

4.捷径

由于整个过程很复杂,并且需要大量的人工干预和修改,因此,我设法构建了(wheel。)软件包(稍作setup.py修改)。

我不知道有一种公开的简单方法,因此(尽管我知道这是一个坏习惯,)我将其上传到[GitHub]:CristiFati / Prebuilt-Binaries-(主)Prebuilt-Binaries / PyGraphviz / v1。 5 / Graphviz-2.42.2 / 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"
Run Code Online (Sandbox Code Playgroud)

注意它也适用于Anaconda环境!


Tom*_*nks 5

投票最多的答案似乎是安装graphviz,而不是pygraphviz.

如果您使用的是conda环境,可以尝试使用此频道:

conda install graphviz pygraphviz -c alubbock

我试了一下networkx 2.1,它工作得很好.


dar*_*ipo 2

这对我有用:

赢 7 AMD64

我在 github 上放了一些关于它的东西。它很混乱,使用风险自负: https://github.com/darkhipo/Easy-Digraph-Draw

  • 我想知道为什么这个被否决了,而不是 @dot-nix 的(虽然应该被否决,但没有被否决)。 (2认同)