您现在的位置是:首页 >技术杂谈 >AttributeError: Can‘t get attribute ‘xxx‘ on <module ‘__main__‘ from ‘xxx‘网站首页技术杂谈

AttributeError: Can‘t get attribute ‘xxx‘ on <module ‘__main__‘ from ‘xxx‘

I_am_programmer 2023-06-13 04:00:03
简介AttributeError: Can‘t get attribute ‘xxx‘ on <module ‘__main__‘ from ‘xxx‘

在学习python时,开发学生选课系统,期间出现AttributeError: Can't get attribute 'Course' on <module '__main__' from '/Users/lijing/PycharmProjects/pythonProject/学生选课系统大作业/teacher_homeworkday25/bin/start.py'>报错。

首先看下项目结构

我们是在start.py中启动的项目 

db包下存储了学生、管理员的登录信息(userinfo),课程对象(course_info),学生对象(student_info)

解决方案:

然后我们看下报错代码,当调用get_from_pickle读取student_info或者course_info时,就会出现AttributeError: Can't get attribute 'Student' on <module '__main__' from '/Users/lijing/PycharmProjects/pythonProject/学生选课系统大作业/teacher_homeworkday25/bin/start.py'>或者AttributeError: Can't get attribute 'Course' on <module '__main__' from '/Users/lijing/PycharmProjects/pythonProject/学生选课系统大作业/teacher_homeworkday25/bin/start.py'>的报错信息,意思是无法从start模块中找到Student或者是Course的类定义

查阅了相关资料后,第一种方法

可以编写一个客户反序列化器,它知道何时遇到__main__模块并引用真正创建类定义的模块。告诉程序需要从core.core模块中找到类定义,而不是从start模块中

代码如下

import pickle

class MyCustomUnpickler(pickle.Unpickler):

    def find_class(self, module, name):

        if module == "__main__":

            module = "program"

        return super().find_class(module, name)

with open('out.pkl', 'rb') as f:

    unpickler = MyCustomUnpickler(f)

    obj = unpickler.load()

print(obj)

print(obj.name)

第二种方法

start文件导入core模块的方式改为from core.core import *,程序还是会从start模块中找Student和Course的类定义,这样写是在start模块中引用core模块中所有的变量。程序的执行只需写一个main()即可

 

参考资料:

由于原文是英文直译,阅读时可能会有很多不通顺的地方

读取pickle文件时的AttributeError - 第一PHP社区tt

拓展资料:

python:copyreg --- 注册配合 pickle 模块使用的函数_做好自己提升技术的博客-CSDN博客

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。