记一次 Python debug

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

内容简介:话说这个事儿已经是去年发生的了(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 打开后查看代码


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

查看所有标签

猜你喜欢:

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

国际游戏设计全教程

国际游戏设计全教程

[美]迈克尔·萨蒙德 / 张然、赵嫣 / 中国青年出版社 / 2017-2 / 108.00元

你想成为一名电子游戏设计师吗?想知道《肯塔基0号路》《到家》《枪口》等独立游戏的制作理念及过程吗?想了解《戈莫布偶大冒险》《辐射3》《战争机器》中关卡设计的奥秘吗?本书用通俗易懂的文字介绍了在游戏开发与策划过程中,需要掌握的游戏设计原理和制作的基础知识,可以作为读者从“构思一个电子游戏”到“真正完成一个电子游戏”的完备指南。 本书以系统的游戏设计流程结合大量优秀的游戏设计案例进行讲解,让读者......一起来看看 《国际游戏设计全教程》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具