1个bug引发学界“震动”,通过代码来分析问题出在哪?

218 篇文章 6 订阅
207 篇文章 6 订阅
一篇科研论文的Python脚本在不同操作系统下读取文件时出现不一致,问题出在glob.glob函数未进行排序。虽然在Windows 10和Ubuntu 18上测试结果显示按文件名升序排序,但该问题暴露了学术界对编程的掌握程度和代码复现的挑战。
摘要由CSDN通过智能技术生成

近日一篇“**A guide to small-molecule structure assignment through computation of (1H and 13C) NMR chemical shifts”**火爆网络,据笔者看到的资料上看这篇论文自身的结果没有什么问题,但是呢这篇论文附带了一份Pyhon程序,这个附带的Python脚本出现了一定问题。

其代码网址如下:https://media.nature.com/original/nature-assets/nprot/journal/v9/n3/extref/nprot.2014.042-S2.zip

笔者第一时间下载了相关代码,下面来带大家分析一下具体的情况。

BUG情况分析

从目前看到的资料上看,这个BUG出现在读入“Gaussian Output Files”,这个函数,在不同的操作系统下会有不同的输出结果。

1个bug引发学界“震动”,通过代码来分析问题出在哪?

如果读者也下载了相关代码,会看到这篇论文本身带有For Python2和Python3两个套脚本,不过读取高斯输出文件的写法没有什么不同。

分别在\nprot.2014.042-S2\Supplementary Data 2\Python Scripts (for Python v2)\nmr-data_compilation.py和\nprot.2014.042-S2\Supplementary Data 2\Python Scripts (for Python v3)\nmr-data_compilation.py的函数read_gaussian_outputfiles下。

其函数具体内容如下:

1个bug引发学界“震动”,通过代码来分析问题出在哪?

从上述文件中我们可以看到这个函数是使用 glob.glob(’*.out’):来添加相关文件的,这个函数本身没有任何排序的行为,而且从Main函数的情况看,其所有后续处理也全部是依赖read_gaussian_outputfiles函数的返回的,具体代码如下:

1个bug引发学界“震动”,通过代码来分析问题出在哪?

那么这个 glob.glob函数是否会带排序功能呢,可以打开你\Python的根目录\Lib\glob.py来找到答案可以看到glob.glob函数的定义及官方说明如下,这个函数可以支持递归,但是没有说会自动排序。

1个bug引发学界“震动”,通过代码来分析问题出在哪?

而且从这个glob方法的具体实现iterdir函数上看也没有进行排序,这个iterdir是靠os.scan来进行添加文件的。

1个bug引发学界“震动”,通过代码来分析问题出在哪?

那么再打开你\Python的根目录\Lib\os.py可以看到scandir其实就是系统调用,也就是说这个python脚本调用了glob.glob方法来读入文件,glob.glob方法就调用iterdir方法操作,而最终调用的os.scan又完全依赖于系统的行为。所以在不同系统中会有不同返回就可想而知了。

不过问题可以也不会像想象的那样严重,因为笔者在WINDOWS10和UBANTU18上对glob.glob方法进行测试的结果还都是对文件名升序排序的,也就是与预期一致。

image.png

windows下的验证结果

1个bug引发学界“震动”,通过代码来分析问题出在哪?

UBANTU18下的验证结果

后记

不过这个BUG也反应出学术界的一些问题,一是没有像GITHUB这样的开源平台,学界对论文复现,肯定不像IT业这么普及,二是非IT学术界的编程能力其实堪忧,但是目前很多论文都有关数据分析,还是需要一定的编程能力的,而且一旦某一顶级论文附带脚本出现BUG,其影响可能特别巨大。

对于这个bug你有什么看法呢?欢迎大家在评论区分享自己的观点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值