我正在尝试创建一个GCP云函数,它加载一个要使用的酸洗python对象。
pickle以字节字符串的形式存储。
该函数在加载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类。
发布于 2020-01-21 06:04:40
问题是谷歌云函数实际上是从它自己的__main__导入和调用你的代码。所以,当你的main.py中有Myclass时,当你的pickled文件需要__main__.Myclass时,它会显示为main.Myclass。我可以通过简单地将类直接添加到__main__模块中来破解它,方法是在加载您的pickled文件之前执行setattr(sys.modules["__main__"],'MyClass',MyClass)。
https://stackoverflow.com/questions/57671400
复制相似问题