上回说到,我尝试运行kkg-bert源代码,并遇到了各种问题并寻找方法将他们解决。今天我的计划是,继续解决问题,成功运转代码后,开始阅读并深入理解
二、继续解决报错
我的主要课题是link prediction功能,因此我的阅读也以这个.py文件为主。
之前以为我的硬件设置有问题,代码没有成功运行,不过放置了一会居然开始运作了,并且出现了像那么一回事的一些运行结果。不过在output变量的目标文件夹中并没有发现变化,应该还是存在一些问题导致不能成功运作。
在这么一长串我看不太懂的运行结果后面,是一个’Traceback (most recent call last):‘,如下图所示,这应该就是问题所在了。
粗略查找了一下csdn,发现这种报错一般出现在没有安装库或者模块,如下文:
python问题 Traceback (most recent call last)_叶片儿的博客-CSDN博客
但明显我的报错中问题并非如此,然后我发现,点击蓝色链接可以直接跳转到对应行数,并且我发现了pycharm报错的问题。
1. 错误1
第一个问题是格式问题,如下图:
解决方案在下文中有体现:
【错误记录】PyCharm 运行 Python 程序报错 ( PEP 8: E305 expected 2 blank lines after class or function definiti )_韩曙亮的博客-CSDN博客
即在
if __name__ == "__main__":
语句上方空一行出来就行了。
2. 错误2
错误2指向了main函数中的一行,在询问领队之后,她建议让我debug慢慢试,于是我将断点点在错误的那行,并进行debug,debug窗口出现了一大堆不认识的数据,不过有几个尤其显眼,因为后面有出现
’Traceback (most recent call last):‘
如下图:
这两个变量是在tensor的文档中出现的,会不会是tensor的环境有一些兼容问题呢?
忙碌了好几个小时,对各种操作都熟悉了一些,但对debug依旧思路不清晰,比如说,py文件由 “class的定义”+“函数的def”+main 组成,那设置断点时,是应该按代码上下文顺序依次设置吗?但代码明显不是按这个顺序运作,而断点设在main函数中,又有一些奇怪的没有见过的变量,且并没有从代码一开头开始运作。于是我决定观看一下其他程序员debug的过程。
好的,我认为我应该掌握了debug的基本方法,就是设置断点+单步运行,断点既可以设置在main函数中,也可以设置在类或者其他函数中,当是后者的情况时,debug应该会从main第一次调用该类/函数的时候开始跑。
于是我从第一行开始逐个理解每个类和函数,并弄清楚了文件中定义的所有类和函数的输入输出和处理方法。
在跑到main函数的某行之后,继续debug,函数就跳到了最底部也就是进main函数的地方,再debug,程序就结束了。对于这个bug,我决定还是去寻求前辈的力量了,之后有感悟我再继续写。
经过这两天对程序的阅读,我对python的理解应该可以说勉强入门了,可以比较 快得对各种类、函数、变量的调用作出反应,也顺利理解了600行左右的代码。不过如果让我自己动手写还是有困难的,特别是我现在对代码作出修改都还不一定能做到。
综合下来看,python的调用关系确实没有c那么复杂,我目前基本上也只碰上了list和dic两种数据结构。但为了扎实的基础,确实各种基本函数、方法的细节还是得牢牢掌握。
---------------------------------编辑于2022年4月2日----------------------------------------
去寻找了前辈,她针对我出现的报错提供的意见让我学到了一些新的知识:
一、如果是环境、硬件的错误,那是会体现出来的,而不是只出现出错的位置
二、最先考虑到的是数据集有问题
三、通过更换已经生效的数据集确定不是数据集的错误
四、在一系列的报错中,最有价值的是有错误陈述的那些,将那条的详细拎去百度或者其他地方搜索,一般就能找到答案。
最后,在简单的搜查后,前辈反应过来应该是python的版本问题,她将3.10改成3.7,我再次进行环境配置等操作,这次模型可以成功运行了。
尽管中间有一些经验上的差距,我认为我也得能够想出问题的答案,而不能将问题抛出去,自己不想动脑子。这次经历过后,之后在遇到问题时应该要学会多试、多思考。