Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 2和Python 3脚本之间封送数据_Python - Fatal编程技术网

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

在Python 2和Python 3脚本之间封送数据,python,Python,因此,我有以下怪事:一个python2脚本需要使用一组只适用于python2的模块,还有一些功能需要使用与我正在使用的(旧)python2版本不兼容的库。因此,我想我最好使用最新的python版本来实现该功能,即python3。所以我现在要做的(在python2脚本中)是使用 在python3脚本中,我做到了 some_variable = sys.argv[1] other_variable = sys.argv[2] 它并不漂亮,但它可以工作,因为直到现在我只需要传递简单的字符串 但是现在

因此,我有以下怪事:一个python2脚本需要使用一组只适用于python2的模块,还有一些功能需要使用与我正在使用的(旧)python2版本不兼容的库。因此,我想我最好使用最新的python版本来实现该功能,即python3。所以我现在要做的(在python2脚本中)是使用

在python3脚本中,我做到了

some_variable = sys.argv[1]
other_variable = sys.argv[2]
它并不漂亮,但它可以工作,因为直到现在我只需要传递简单的字符串

但是现在我需要发送更复杂和更大的数据结构(基本上是对象的dict),虽然理论上我可以去掉对象的所有方法,将它们重新实现为独立函数,手动序列化dict并在python3端反序列化它们,我想用一些更结实、劳动强度更小的东西

在我看来,我有两个选择——使用可移植的序列化方法(但这不允许我将对象与方法一起使用),或者找到某种方式在python2和python3实例之间共享对象定义和数据

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


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

您可以在python2和python3之间安全地共享
.py
模块,只要代码与语言的两个版本兼容。这是因为Python3使用了一种不同的方案来缓存字节码,其中的文件是特定于次要版本的;对于Python2和Python3解释器,您将有单独的
.pyc
文件。见此:

第一次导入模块时(或在创建当前编译文件后源文件已更改时),应在包含
.py
文件的目录的
\uuuuuu pycache\uuuu
子目录中创建包含编译代码的.pyc文件。
.pyc
文件的文件名将以与
.py
文件相同的名称开头,以
.pyc
结尾,中间的组件取决于创建它的特定python二进制文件。(详情请参见)

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


您可以使用
pickle
模块跨Python版本进行序列化和反序列化,只要您坚持使用Python 2字符串数据的已知编解码器。有关后者的详细信息,请参阅。

我支持酸洗。您的流程可以通过文件描述符与pickle对象、结果或任何其他内容进行通信(例如,您可以借助新子流程的STDIN和STDOUT与创建流程进行通信),这对于我的特定情况不再是问题,只是为了清楚起见-“这两个解释器仍然可以并排运行,因为.pyc文件中也包含版本信息,每次任何一个解释器导入具有不正确缓存文件版本的模块时,都会替换它们。"; 当一个进程调用另一个进程,然后在第二个进程返回后继续使用编译后的结构时,这仍然有效吗?我猜pyc只在导入完成时才被读取,之后它都在内存中,所以第二个进程覆盖第一个进程的pyc不再重要了?@Roel:没错
.pyc
文件(使用
marshall
模块)加载到内存中的代码对象中,并执行顶级代码对象,生成模块名称空间。磁盘上的文件在此点之后不再需要。
some_variable = sys.argv[1]
other_variable = sys.argv[2]