【问题标题】:Problem with pydot when trying to draw a simple Graph with networkx and graphviz尝试使用 networkx 和 graphviz 绘制简单图形时 pydot 出现问题
【发布时间】:2020-08-17 23:50:20
【问题描述】:

我想用networkx和graphviz画一个简单的图,但是pydot似乎有问题。

我正在使用

  • Ubuntu 18.04.4 LTS
  • Python 3.6.9
  • graphviz 0.14
  • networkx 2.4
  • 最新版本的 pydot、pydot2、pydot3 和 pydotplus

我试着跑了:

import networkx as nx

G = nx.complete_graph(4)
pos = nx.nx_pydot.graphviz_layout(G)
pos = nx.nx_pydot.graphviz_layout(G, prog='dot')

但无论我使用什么 pydot 模块并且我不知道为什么,似乎都会出错。

对于 pydot2 1.0.33 我得到:

Couldn't import dot_parser, loading of dot files will not be possible.
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
      1 G = nx.complete_graph(4)
----> 2 pos = nx.nx_pydot.graphviz_layout(G)
      3 pos = nx.nx_pydot.graphviz_layout(G, prog='dot')

/usr/local/lib/python3.6/dist-packages/networkx/drawing/nx_pydot.py in graphviz_layout(G, prog, root)
    266     This is a wrapper for pydot_layout.
    267     """
--> 268     return pydot_layout(G=G, prog=prog, root=root)
    269 
    270 

/usr/local/lib/python3.6/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root)
    314     # List of low-level bytes comprising a string in the dot language converted
    315     # from the passed graph with the passed external GraphViz command.
--> 316     D_bytes = P.create_dot(prog=prog)
    317 
    318     # Unique string decoded from these bytes with the preferred locale encoding

/usr/local/lib/python3.6/dist-packages/pydot.py in (f, prog)
   1800             self.__setattr__(
   1801                 'create_'+frmt,
-> 1802                 lambda f=frmt, prog=self.prog : self.create(format=f, prog=prog))
   1803             f = self.__dict__['create_'+frmt]
   1804             f.__doc__ = '''Refer to the docstring accompanying the 'create' method for more information.'''

/usr/local/lib/python3.6/dist-packages/pydot.py in create(self, prog, format)
   1964         tmp_fd, tmp_name = tempfile.mkstemp()
   1965         os.close(tmp_fd)
-> 1966         self.write(tmp_name)
   1967         tmp_dir = os.path.dirname(tmp_name )
   1968 

/usr/local/lib/python3.6/dist-packages/pydot.py in write(self, path, prog, format)
   1893             prog = self.prog
   1894 
-> 1895         dot_fd = file(path, "w+b")
   1896         if format == 'raw':
   1897             data = self.to_string()

NameError: name 'file' is not defined

对于 pydot3 我得到:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in 
      1 G = nx.complete_graph(4)
----> 2 pos = nx.nx_pydot.graphviz_layout(G)
      3 pos = nx.nx_pydot.graphviz_layout(G, prog='dot')

/usr/local/lib/python3.6/dist-packages/networkx/drawing/nx_pydot.py in graphviz_layout(G, prog, root)
    266     This is a wrapper for pydot_layout.
    267     """
--> 268     return pydot_layout(G=G, prog=prog, root=root)
    269 
    270 

/usr/local/lib/python3.6/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root)
    314     # List of low-level bytes comprising a string in the dot language converted
    315     # from the passed graph with the passed external GraphViz command.
--> 316     D_bytes = P.create_dot(prog=prog)
    317 
    318     # Unique string decoded from these bytes with the preferred locale encoding

/usr/local/lib/python3.6/dist-packages/pydot/__init__.py in (f, prog)
   1798             self.__setattr__(
   1799                 'create_'+frmt,
-> 1800                 lambda f=frmt, prog=self.prog : self.create(format=f, prog=prog))
   1801             f = self.__dict__['create_'+frmt]
   1802             f.__doc__ = '''Refer to the docstring accompanying the 'create' method for more information.'''

/usr/local/lib/python3.6/dist-packages/pydot/__init__.py in create(self, prog, format)
   2011 
   2012             if stderr_output:
-> 2013                 stderr_output = ''.join(stderr_output)
   2014 
   2015         #pid, status = os.waitpid(p.pid, 0)

TypeError: sequence item 0: expected str instance, bytes found

对于 pydotplus 2.0.2 我得到:

ModuleNotFoundError                       Traceback (most recent call last)
 in 
      1 G = nx.complete_graph(4)
----> 2 pos = nx.nx_pydot.graphviz_layout(G)
      3 pos = nx.nx_pydot.graphviz_layout(G, prog='dot')

/usr/local/lib/python3.6/dist-packages/networkx/drawing/nx_pydot.py in graphviz_layout(G, prog, root)
    266     This is a wrapper for pydot_layout.
    267     """
--> 268     return pydot_layout(G=G, prog=prog, root=root)
    269 
    270 

/usr/local/lib/python3.6/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root)
    307 
    308     """
--> 309     import pydot
    310     P = to_pydot(G)
    311     if root is not None:

ModuleNotFoundError: No module named 'pydot'

pydot 出现解析错误,pydot2 出现文件未找到错误。

【问题讨论】:

  • 你是在虚拟环境中运行吗?
  • 不,我不这样做。
  • 这是一个老问题,所以我不确定您是否仍然对解决方案感兴趣或想帮助回答它。但是:您的代码在我的系统上运行良好(Windows、Python 3.9.6 64 位、networkx==2.6.3、pydot==1.4.2)。也许旧版本中存在一个现已修复的错误。另外:您是否同时安装了pydotpydot2?它们似乎是相互冲突的包(都使用import pydot,因此无法将它们与Python代码区分开来)。

标签: python graph networkx graphviz pydot


【解决方案1】:

尝试设置图形名称(例如G.name='test'

【讨论】:

  • 想解释一下它的作用以及它如何解决问题?
  • 这个答案被标记为Low Quality 并且可以从解释中受益。以下是How do I write a good answer? 的一些指南。仅代码答案不被视为好的答案,并且可能会被否决和/或删除,因为它们对学习者社区不太有用。它只对你很明显。解释它的作用,以及它与现有答案(如果有的话)有何不同/更好。 From Review
猜你喜欢
  • 2021-07-27
  • 1970-01-01
  • 2019-10-27
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多