Python 3.7 错误:不支持的 Pickle 协议 5

hub*_*bs5 35 python pickle

我正在尝试从 RLLib 恢复腌制的配置文件(json 没有如本文所示那样工作),并收到以下错误:

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

Run Code Online (Sandbox Code Playgroud)

Python 版本 = 3.7.0

如何在 3.7 中打开此文件?

hd1*_*hd1 38

使用pickle5或将其加载到python 3.8+中,然后使用协议参数将其序列化为较低版本。

  • 使用 pandas 数据帧序列化到较低版本的具体示例: df.to_pickle('filename.pkl', protocol=4) (4认同)
  • 不知道pickle5!我正在设置 3.8 虚拟环境并安装所有依赖项,但这要容易得多。谢谢! (2认同)
  • ModuleNotFoundError:尽管我导入了它,但没有名为“pickle5”的模块。 (2认同)
  • @Nir 正是我需要的,谢谢! (2认同)

sha*_*adi 36

对于在python 3.8中使用协议5将数据帧保存到pickle文件并需要将其加载到仅支持协议4的python 3.6的pandas用户(我在看你的google colab):

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

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

data.to_pickle(path_to_protocol4)
Run Code Online (Sandbox Code Playgroud)

更新:如果在从 stable-baselines3 加载模型时遇到这个:

!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)
Run Code Online (Sandbox Code Playgroud)

2021-05-31 使用 env 测试:

cloudpickle: 1.6.0
pickle5: 0.0.11 
stable-baselines3: 1.0
Run Code Online (Sandbox Code Playgroud)

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