python - 由于命名空间,在 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 类。
解决方案
问题是谷歌云函数实际上是从它自己的导入和调用你的代码__main__
。所以当你有 Myclass 时,main.py
它会像main.Myclass
你期待的腌制文件一样显示出来__main__.Myclass
。我可以通过在加载腌制文件之前将类直接添加到__main__
模块中来破解它。setattr(sys.modules["__main__"],'MyClass',MyClass)
推荐阅读
- flutter - 如何将命令行参数从颤振传递到“发布升级”
- python - 使用 torch.utils.data 的数据集和数据加载器加载数据时出错。TypeError:“类型”类型的对象没有 len()
- android - Gigya Android 在登录时不会进入挂起注册回调
- node.js - 如何删除一个没有集合名称的文档?
- php - Android 值未插入到我的 mysql 数据库中
- npm - npm 和 yarn 的区别
- eclipse - 将 Web 应用程序添加到 websphere 自由配置文件的 Eclipse 错误。不支持项目构面动态 Web 模块 2.5 版
- jenkins - 如何在詹金斯的多个从节点中运行作业?
- c# - 如何在异步任务列表中创建 DataGrid ItemSource
- regex - 正则表达式中的 False [] 范围