【发布时间】: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)。也许旧版本中存在一个现已修复的错误。另外:您是否同时安装了
pydot和pydot2?它们似乎是相互冲突的包(都使用import pydot,因此无法将它们与Python代码区分开来)。
标签: python graph networkx graphviz pydot