首页 > 解决方案 > 将 python 对象从 python2 脚本传递到 python3 脚本

问题描述

我遇到了一个问题,我当前的流量生成器:Warp17 生成了仅与 python2 兼容的 python 代码。我们正在将所有其他内容移至 python3,因此我创建了一个包装我们的 warp17 api 的 cli 工具。有没有比仅打印输出并将其加载到 json 中更好的方法从下标传递信息?

#!/usr/bin/python

import python2_api

if __name__ == "__main__":
  do_some_argparse()
  result = dict(run_some_code_on_args())
  print(result)

def run_warp_cli(*args):
  result = subprocess.Popen('warp_cli', args)
  return json.loads(result)

这基本上就是我正在做的事情。我很好奇是否有任何有趣的方法可以避免这样做并取回实际的 python 字典对象等。

标签: pythonpython-3.xpython-2.7

解决方案


字典的二进制表示,实际上是一般的对象,在 Python 2 和 Python 3 之间发生了相当大的变化。这意味着您将无法在 Python 版本之间直接使用对象。某种形式的序列化为相互可接受的格式是必要的。

您使用的 JSON 格式符合此标准。我建议坚持使用它,因为它灵活、易于阅读且非常通用。

如果空间成为问题,您可以考虑将酸洗作为替代方案,但我不建议将其作为首选。虽然pickle.load可以很好地理解 Python 2 数据,但对于 Python 版本之间数据类型的不同解释,需要牢记许多注意事项,尤其是bytesUnpickling a python 2 object with python 3

这是一个资源,可以帮助您解决在 Python 3 端取消选择的一些常见错误:TypeError: a bytes-like object is required, not 'str' when opening Python 2 Pickle file in Python 3


推荐阅读