【问题标题】:Python 3.7 Error: Unsupported Pickle Protocol 5Python 3.7 错误:不支持的 Pickle 协议 5
【发布时间】:2020-11-29 10:27:39
【问题描述】:

我正在尝试从 RLLib (json didn't work as shown in this post) 恢复腌制配置文件,并收到以下错误:

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 版本 = 3.7.0

如何在 3.7 中打开此文件?

【问题讨论】:

  • 你知道这个文件保存在哪个版本吗?
  • 不幸的是,我没有。虽然试图追踪它。

标签: python pickle


【解决方案1】:

对于在 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)

还可以从 python 3.6 保存到协议 4 泡菜中

data.to_pickle(path_to_protocol4)

更新:如果在从 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)

于 2021-05-31 使用 env 测试:

cloudpickle: 1.6.0
pickle5: 0.0.11 
stable-baselines3: 1.0

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

【讨论】:

  • 非常感谢!!很有帮助!
【解决方案2】:

如果此错误是由于 heroku 部署 造成的,请检查您的本地设置和 heroku 设置的 python 版本。 如果两者不同,则可能会导致此错误。
解决方案:

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

然后在你的 runtime.txt 中提及你的本地 python 版本,这样就不会有冲突。

python-3.9.2

【讨论】:

    【解决方案3】:

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

    Python Error: Unsupported Pickle Protocol 5 
    

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

    pip install spyder-kernels
    

    当然,这可能会在 Spyder 中引入一些违规行为(即,由于解释器不同,它应该附带的软件包不再存在)。在调试时应该很容易发现这些问题,并使用标准 pip 安装解决。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 不知道pickle5!我正在设置 3.8 虚拟环境并安装所有依赖项,但这要容易得多。谢谢!
      • 我自己发现的。 PyPi 需要更擅长做广告。
      • ModuleNotFoundError: No module named 'pickle5' 虽然我导入了它。
      • 它安装在你的 venv 中了吗?
      • 用pandas数据框序列化到低版本的具体例子:df.to_pickle('filename.pkl', protocol=4)
      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2017-10-01
      • 2017-06-14
      • 2023-03-30
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多