繁体   English   中英

在Python 2和Python 3脚本之间封送数据

[英]Marshaling data between Python 2 and Python 3 scripts

因此,我有以下怪诞之处:需要使用一堆仅适用于python2的模块的python2脚本,以及一些我需要使用不适用于(旧)python2版本的库的功能米使用。 因此,我认为我不妨使用最新的python版本来实现该功能,即python3。 所以我现在(在python2脚本中)所做的就是使用

subprocess.call(["/path/to/python3", "python3_script.py", "argument", "more argument"])

然后在python3脚本中

some_variable = sys.argv[1]
other_variable = sys.argv[2]

它不是很漂亮,但是可以用,因为直到现在我只需要传递简单的字符串。

但是,现在我需要发送更复杂,更大的数据结构(本质上是对象的字典),而从理论上讲,我可以剥离对象的所有方法,将它们重新实现为独立功能,在python3端手动序列化字典并反序列化它们,我想使用更可靠,更省力的工具。

如我所见,我有两个选择-使用可移植的序列化方法(但这不会让我将对象与方法一起使用)或找到某种方法在python2和python3实例之间共享对象定义和数据。

因此,假设我有一个名为Foo的模块,并且在其中定义了带有一些方法的Foo类,是否可以在同时运行的python2和python3进程中使用该类? 更具体地说,生成的.pyc文件是否会不同并且会相互干扰?

其次,是否有一种方法(无论是语言还是库中的方法)可以让我序列化python2中的数据结构,将其作为字符串传递给python3脚本,然后让我从python3脚本中正确地反序列化?

您可以在Python 2和Python 3之间安全地共享.py模块,前提是该代码与该语言的两个版本均兼容。 这是因为Python 3使用不同的方案来缓存字节码,其中文件是次要版本专用的。 您将为Python 2和Python 3解释器使用单独的.pyc文件。 请参阅此Python编程常见问题解答条目

首次导入模块时(或自创建当前编译文件以来源文件已更改),应在包含.py文件的目录的__pycache__子目录中创建一个包含编译代码的.pyc文件。 .pyc文件的文件名以与.py文件相同的名称开头,以.pyc结尾,中间的组件取决于创建该文件的特定python二进制文件。 (有关详情,请参见PEP 3147 )。

即使不是这种情况,两个解释器仍然可以并排运行,因为.pyc文件可以一步被读入内存并在其中包含版本信息,并且每一个解释器每次导入模块时都将替换它们。缓存文件版本不正确。

您可以使用pickle模块在Python版本之间进行序列化和反序列化,前提是您选择了兼容的协议版本并坚持使用已知的编解码器来存储Python 2字符串数据。 有关后者的详细信息,请参见用python 3解开python 2对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM