首页 > 解决方案 > 由于命名空间,在 Google Cloud Functions 中加载 pickle (python) 失败

问题描述

我正在尝试创建一个 GCP 云函数,它加载一个腌制的 python 对象以供使用。

pickle 存储为字节字符串。

加载带有错误的泡菜时,该功能失败: "Can't get attribute 'MyClass' on <module 'google.cloud.functions.worker' from '/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py'>"

从那我假设问题是由于命名空间,因为当创建对象时它存储在<module '__main__'>

我发现Unable to load files using pickle and multiple modules这很有用,但我认为这两种解决方案都不可能在云功能中实现。

我将如何加载在函数之外腌制的腌制对象?

注意我在函数中有 MyClass 类。

标签: pythongoogle-cloud-platformgoogle-cloud-functionspickle

解决方案


问题是谷歌云函数实际上是从它自己的导入和调用你的代码__main__。所以当你有 Myclass 时,main.py它会像main.Myclass你期待的腌制文件一样显示出来__main__.Myclass。我可以通过在加载腌制文件之前将类直接添加到__main__模块中来破解它。setattr(sys.modules["__main__"],'MyClass',MyClass)


推荐阅读