我能否在Python 3中进行pickling,然后在Python 2中进行unpickling?

4
我试图解决的问题是: 我有一个 networkx 图,我想将它绘制成 circular tree。这需要使用 GraphvizPyGraphviz 或者 Pydot,但它们不适用于Python 3。
我正在考虑在Python 3中序列化图形对象,然后在Python 2环境中进行反序列化以便于绘制。然而,由于不能假设两个环境中的相应对象相似,因此我不清楚这种方法可能存在的潜在问题。
除了实际尝试之外(我目前没有机器上的Python 2环境),是否有任何方法可以找出是否可能实现这一点?还是按照不同的路径进行操作,例如导出到不同的格式(如Gephi),甚至在Python之外进行绘图,会更加合理?

1
最好的方法是使您的对象状态与标准Python结构兼容,并使用json进行序列化。没有任何意外。 - Jean-François Fabre
将项目升级到Python 3现在并不那么困难。考虑为PyGraphviz或Pydot创建一个拉取请求以添加支持? - Martijn Pieters
反向问题:https://dev59.com/114c5IYBdhLWcg3wLXvI - Chris_Rands
@PatrickAllo:听起来你已经安装了Pyparsing 1.5.6,但Pydot需要2.1.4或更高版本。 - Martijn Pieters
@MartijnPieters:经过一些调试(我已经安装了Pyparsing 2.1.4),我已经安装了所有必需的模块。最后一步是注意到这个在线示例中有一个错误:https://networkx.github.io/documentation/networkx-1.9/examples/drawing/circular_tree.html - Patrick Allo
显示剩余5条评论
1个回答

2
是的,你可以在Python 3中转储数据以便在Python 2中重新加载。你可能想设置fix_imports,并使用低于3的协议。从pickle.dump()文档中了解到:

如果fix_imports为true且protocol小于3,则pickle将尝试将Python 3的新名称映射到Python 2中使用的旧模块名称,以便pickle数据流可在Python 2中读取。

协议版本2支持Python 2.3 - 2.7。

但是,考虑一些替代方案:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接