【发布时间】:2014-02-02 22:41:41
【问题描述】:
我正在尝试将以下伪代码转换为 Python:
如果中创建一个文件不存在: 为 创建所有子目录 在
这听起来很简单,可以使用 os.makedirs 和 os.path.isdir 完成:
if not os.path.isdir('/some/path'):
os.makedirs('/some/path')
open('/some/path/test.txt', 'w')
但是,经过进一步检查,显然存在竞争条件。考虑以下时间表:
- 指定的目录(
/some/path)不存在 - Python 解释器执行第一行,计算结果为
True - 另一个进程创建目录 (
/some/path) -
makedirs引发OSError异常,因为该目录已存在
如果目录最初存在但在执行最后一行之前被另一个进程删除,也会出现问题。
谈到 Python,“请求宽恕比请求许可更容易。”考虑到这一点,上面的片段可以写得更好:
try:
os.makedirs('/some/path')
except OSError:
pass
open('/some/path/test.txt', 'w')
这解决了上述两个问题,但产生了第三个问题:os.makedirs 在以下情况之一发生时引发OSError 异常:
- 目录已经存在
- 无法创建目录
这意味着无法确定这两个条件中的哪一个导致引发异常。换句话说,实际的失败将被默默地忽略,这不是我想要的。
我该如何解决这个问题?
【问题讨论】:
标签: python directory race-condition