记一次 Python debug

栏目: Python · 发布时间: 7年前

内容简介:话说这个事儿已经是去年发生的了(2017.12.26), 当时就说要记录一下来着, 但是一直没有写, 拖到现在又想起这个事情来了, 所以翻出当时的聊天记录重新整理记录一下.事情的背景呢大概就是某(前)同事, 用 Python 写一个脚本工具的时候, 发现总是报错, 报错的那个版本的代码已不可考, 而且当时他报告的出错现象其实并不准确, 因为其实照那个方式不是百分之百再现. 当然这些都可以不用太关心, 反正最终经过整理, 发现可以稳定重现 bug 的代码大致如下:其实发现这3行代码会稳定出错的过程也是很有趣

话说这个事儿已经是去年发生的了(2017.12.26), 当时就说要记录一下来着, 但是一直没有写, 拖到现在又想起这个事情来了, 所以翻出当时的聊天记录重新整理记录一下.

背景

事情的背景呢大概就是某(前)同事, 用 Python 写一个脚本 工具 的时候, 发现总是报错, 报错的那个版本的代码已不可考, 而且当时他报告的出错现象其实并不准确, 因为其实照那个方式不是百分之百再现. 当然这些都可以不用太关心, 反正最终经过整理, 发现可以稳定重现 bug 的代码大致如下:

# 以下版本已经是忽略掉所以无用代码仅仅展示稳定出现异常的部分

import distutils.dir_util
import shutil

path = "/home/lane/path"
path_new = "/home/lane/path_new"

# 以下3行是出错的稳定再现办法

# 使用 distutils.dir_util.copy_tree 拷贝源目录到新地址, 可以成功
distutils.dir_util.copy_tree(path, path_new)

# 使用 shutil.rmtree 删除掉新的目录
shutil.rmtree(path_new)

# 再次使用 distutils.dir_util.copy_tree 尝试拷贝源目录到新地址
# 此时百分之百稳定报错
# 此时报错信息类似:
# IOError: [Errno 2] No such file or directory: 'home/lane/path_new/sub_folder/test.txt'
distutils.dir_util.copy_tree(path, path_new)

分析

其实发现这3行代码会稳定出错的过程也是很有趣的, 但是由于代码有点多和很久了, 没法考证这部分历史了. 所以只能忽略掉了.

但是仅仅看这三行代码其实似乎也没什么出错的道理, 我既然第一次拷贝可以成功, 那么为什么第二次拷贝却会百分之百稳定报错呢? 中间我只进行了一次删除文件夹, 没有道理删掉文件夹就会报错啊, 删除文件夹又不会带来文件权限的变更.

此时仔细观察报错信息会发现一些端倪, 错误是 IOError , 报错的地址是一个第二级目录 /path_new/sub_folder , 其实这种情况我也遭遇过, 就是在 /home/lane/path_new 存在但是 /home/lane/path_new/sub_folder 尚未存在的情况下, 如果你尝试往 sub_folder 中拷贝 test.txt 的话, 系统就会报出类似的错误, 原因就是你尚未创建目录 sub_folder .

那么为什么为啥第一次拷贝的时候不会报这种错误呢? 此时不得不怀疑第一次和第二次拷贝的时候, 模块 distutils.dir_util 使用的是不同的策略.

没有什么道理, 完全就是直觉, 我就直接猜测第一次 copy_tree 拷贝的时候遍历顺序始终是从顶层开始, 再保证上层的各个文件夹创建成功后, 才继续各个上层文件夹下子文件夹的操作. 同时整个 distutils.dir_util 模块会在内部保存某种信息, 使得未来调用该模块的时候可以使用.

而第二次拷贝的时候, 整个 distutils.dir_util 因为已经保存了第一次拷贝的目录就结构, 它可能就会直接尝试从底层直接拷贝文件了, 因为它认为各个层级的目录结构已然存在. 然而由于我们中间执行过一次 shutil.rmtree(path_new) 导致这些目录结构其实已经不存在了, 所以出错.

确认

有了思路其实就可以直接查看源代码确认了, 只要能在模块 distutils.dir_util 中找到某种保存目录结构信息的操作就可以证明我的猜测了.

那么我们直接找到 distutils/dir_util.py 打开后查看代码


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微创新

微创新

德鲁•博迪、雅各布•戈登堡 / 钟莉婷 / 中信出版社 / 2014-4-5 / 42.00

好产品不一定要颠覆,微小改进就能让用户尖叫! 引爆创新领域的全新方法论 互联网时代行之有效的5大创新策略 创业者、产品经理必读的创新行动指南 《怪诞行为学》作者 丹•艾瑞里 《影响力》作者 罗伯特•西奥迪尼 全球50位最具影响力的商业思想家之一丹尼尔•平克 周鸿祎、黎万强、罗振宇、牛文文、张鹏 联袂重磅推荐 为什么iPod可以在众多mp3产品中......一起来看看 《微创新》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具