专栏首页AI科技大本营的专栏Python脚本BUG引发学界震动,影响有多大?

Python脚本BUG引发学界震动,影响有多大?

作者 | beyondma

编辑 | Jane

来源 | 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 论文阅读: https://www.nature.com/articles/nprot.2014.042

下面来带大家分析一下具体的情况。

BUG情况分析

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

如果读者也下载了相关代码会看到这篇论文本身带有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下,其函数具体内容如下:

def read_gaussian_outputfiles():
    list_of_files = []
    for file in glob.glob('*.out'):
        list_of_files.append(file)
    return list_of_files

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

def main():
    lofc = read_gaussian_outputfiles()
    lofc_freq = read_gaussian_freq_outfiles(lofc)
    lofc_nmr = read_gaussian_nmr_outfiles(lofc)
    locs = prepare_list_of_chemical_shifts(lofc_nmr)
    lofe = get_list_of_free_energies(lofc_freq)
    lofe = boltzmann_analysis(lofe)
    lofe = report_chemical_shifts(lofc_nmr, lofe)
    summed_proton_shifts = final_proton_chemical_shifts(lofe)
    summed_carbon_shifts = final_carbon_chemical_shifts(lofe)
    lofe = count_imaginary_freq(lofc_freq, lofe)
    write_final_shift_csv(summed_proton_shifts,summed_carbon_shifts)
    write_master_csv(lofe)

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

def glob(pathname, *, recursive=False):
    """Return a list of paths matching a pathname pattern.
    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns. 
    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """

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

def _iterdir(dirname, dironly):
    if not dirname:
        if isinstance(dirname, bytes):
            dirname = bytes(os.curdir, 'ASCII')
        else:
            dirname = os.curdir
    try:
        with os.scandir(dirname) as it:
            for entry in it:
                try:
                    if not dironly or entry.is_dir():
                        yield entry.name
                except OSError:
                    pass
    except OSError:
        return

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

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

windows下的验证结果

UBANTU18下的验证结果

后记

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

本文分享自微信公众号 - AI科技大本营(rgznai100),作者:CSDN App

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实战 | 深度学习轻松学:如何用可视化界面来部署深度学习模型

    翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 DeepCognition.ai 的创始人。 Deep Cognition (深度认知) 建立的...

    AI科技大本营
  • Keras还是TensorFlow?深度学习框架选型实操分享

    深度学习发展势头迅猛,但近两年涌现的诸多深度学习框架让初学者无所适从。如 Google 的 TensorFlow、亚马逊的 MXNet、Facebook 支持的...

    AI科技大本营
  • 即学即用的30段Python实用代码

    原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less

    AI科技大本营
  • DIY自动化测试【智能音箱】

        笔者从事智能音箱系统测试,这是一款基于android系统的智能语音助手产品。基本功能特性和测试方法都已稳定,目前多产品快速迭代,涉及的场景较多且数据量大...

    Apan
  • 安装声卡驱动的体会

    临时用一台机器(Dimension C521),想听一下张国荣的《当爱已成往事》,却发现系统找不到声卡,放不出声音。

    贰师兄TEN
  • C++核心准则C.42:如果构造函数不能生成合法对象就抛出异常

    Leaving behind an invalid object is asking for trouble.

    面向对象思考
  • Typecho友情链接插件禁用之后重新启动报500错误的解决方法

    laulzgoay
  • 加拿大和迪拜已经走在前面了!城市会成为应用区块链的急先锋

    一提起比特币、门罗币、以太币等加密数字货币,人们往往下意识地会将它们与网络黑市、洗钱、诈骗、割韭菜等现象联系在一起。毕竟,处处都埋有套路掳掠人心的陷阱时,币圈信...

    区块链大本营
  • ES6之Iterator遍历器

    遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据...

    wade
  • 01 . 中小企业到亿级流量架构演进过程

    常见_youmen

扫码关注云+社区

领取腾讯云代金券