将pickle(Python)加载到Google Cloud Functions中由于命名空间问题而失败

3

我正在尝试创建一个GCP云函数,用于加载pickled 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找到了一些有用的信息,但我不认为任何一种解决方案都可以在云函数中实现。

如何才能加载在函数外部pickled的对象?

N.B:我确实在函数中拥有MyClass类。


请添加代码片段以查看您如何调用该函数。 - Kevin Quinzel
1个回答

1
问题在于Google Cloud Functions实际上是从其自己的__main__导入和调用您的代码。因此,虽然您在main.py中有Myclass,但当您的pickled文件期望__main__.Myclass时,它将显示为main.Myclass。我能够通过在加载pickled文件之前直接将类添加到__main__模块来简单地进行黑客攻击,方法是执行setattr(sys.modules["__main__"],'MyClass',MyClass)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接