Python 3.7错误: 不支持 Pickle Protocol 5

我试图从 RLLib (Json 并没有像这篇文章所展示的那样工作)恢复一个 pickle 配置文件,得到以下错误:

config = pickle.load(open(f"{path}/params.pkl", "rb"))


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-28-c964561b863c> in <module>
----> 1 config = pickle.load(open(f"{path}/params.pkl", "rb"))


ValueError: unsupported pickle protocol: 5


Python Version = 3.7.0

我怎样才能在3.7版本中打开这个文件?

144582 次浏览

使用 泡菜5或将其加载到 python 3.8 + 中,然后使用 protocol 参数将其序列化为较低的版本。

对于那些将一个数据帧保存到 python 3.8中的 protocol 5 pickle 文件中,并需要将其加载到仅支持 protocol 4的 python 3.6中的熊猫用户(我正在看你的 谷歌实验室) :

!pip3 install pickle5
import pickle5 as pickle
with open(path_to_protocol5, "rb") as fh:
data = pickle.load(fh)

也可以保存到 python 3.6的 protocol-4 pickle 中

data.to_pickle(path_to_protocol4)

更新: 如果在从稳定基线加载模型时遇到这种情况3:

!pip install --upgrade --quiet cloudpickle pickle5
from stable_baselines3 import PPO
# restart kernel if in jupyter notebook


# Might not need this dict in all cases
custom_objects = {
"lr_schedule": lambda x: .003,
"clip_range": lambda x: .02
}
model = PPO.load("path/to/model.zip", custom_objects=custom_objects)

2021-05-31年度测试环境影响评估:

cloudpickle: 1.6.0
pickle5: 0.0.11
stable-baselines3: 1.0

参考资料: https://brainsteam.co.uk/2021/01/14/pickle-5-madness-with-mlflow/

如果由于 pickle5的依赖关系(主要是 Visual Building c + +)而无法加载 pickle5,另一种解决方案可能是更改正在使用的 Python 解释器(在错误发生之前更改为旧的)。对我来说,在我用 IDLE 运行了一个在 Spyder 中运行过的程序之后,我得到了这个错误。当我在 Spyder 中再次运行它时,它丢弃了这个错误。

Python Error: Unsupported Pickle Protocol 5

为了解决这个问题,我在 Spyder 中将 Python 解释器更改为 IDLE (Tools-> Preferences)中使用的 Python。重新启动 Spyder 之后,我必须通过命令提示符安装必要的依赖项,以便在 Spyder 中可以使用控制台:

pip install spyder-kernels

当然,这可能会在 Spyder 中引入一些不规则之处(也就是说,由于不同的解释器,它应该附带的包不再存在)。这些问题应该在调试时很容易解决,并且可以使用标准 pip 安装来解决。

一旦您恢复了您的(被认为丢失的)文件,考虑恢复到 Spyder 的 Python 解释器,并更新代码以优雅地处理这个问题可能是明智的(我希望有人能够在注释中建议如何做到这一点,而不需要 pickle5!)

如果这个错误是由于 Heroku 部署,然后检查您的本地安装和 heroku 安装的 python 版本。 如果两者不同,那么它可能会导致这个错误。
解决方案:

  • 在应用程序的基本目录中创建 runtime.txt 文件

然后在 runtime.txt 中提到本地 Python 版本,这样就没有冲突了。

python-3.9.2