无法从气流获取模块“ __main__”上的属性“ ClassName”

时间:2019-10-24 03:25:53

标签: python pickle airflow

我正在使用Airflow来整理我的数据管道。在一项任务中,我试图从S3加载一个腌制的对象(rs.Fields("AMafter").Value = (Check2.Value = vbChecked)实例):

RouteModel

这给了我这个错误:

def read_file_from_s3(bucket, file):
    from inference.route_model import RouteModel

    s3_loader = S3Client(bucket, None)
    buffer = s3_loader.get_file(file)

    data = pickle.loads(buffer.read())

使用自定义类时,要腌制的类必须出现在读取腌制过程的名称空间中,在本例中为Airflow。

注意:

我不能改变我腌制文件的方式

请帮助:)

1 个答案:

答案 0 :(得分:0)

要解决该问题,我需要编写自己的自定义解酸器,在其中我显式返回泡菜文件也要引用的特定实例的自定义类:

class CustomUnpickler(pickle.Unpickler):

    def find_class(self, module, name):
        if name == 'RouteModel':
            from inference.route_model import RouteModel
            return RouteModel
        return super().find_class(module, name)

 data = CustomUnpickler(io.BytesIO(buffer.read())).load()