gpt4 book ai didi

python - 如何避免与 makedirs 的竞争条件?

转载 作者:行者123 更新时间:2023-11-28 16:39:22 25 4
gpt4 key购买 nike

我正在尝试将以下伪代码转换为 Python:

If <directory> does not exist:    Create all subdirectories for <directory>Create a file in <directory>

This sounds simple enough to accomplish with os.makedirs and os.path.isdir:

if not os.path.isdir('/some/path'):
os.makedirs('/some/path')
open('/some/path/test.txt', 'w')

但是,经过进一步检查,显然存在竞争条件。考虑以下时间表:

  1. 指定的目录(/some/path)不存在
  2. Python 解释器执行第一行,计算结果为 True
  3. 另一个进程创建目录(/some/path)
  4. makedirs 引发 OSError 异常,因为目录已经存在

如果目录最初存在但在执行最后一行之前被另一个进程删除,也会出现问题。

谈到 Python,“请求原谅比获得许可更容易。”考虑到这一点,上面的片段可以写得更好:

try:
os.makedirs('/some/path')
except OSError:
pass
open('/some/path/test.txt', 'w')

这解决了上述两个问题,但产生了第三个问题:os.makedirs 在以下情况之一发生时引发 OSError 异常:

  • 目录已经存在
  • 无法创建目录

这意味着无法确定这两个条件中的哪一个导致引发异常。换句话说,实际的失败将被默默地忽略,这不是我想要的。

我该如何解决这个问题?

最佳答案

我会注意到所有这些在 python 3 中都更加理智; FileExistsErrorPermissionError 是您可以捕获的独立(OSError 的子类)异常,os.makedirs 甚至具有一个 exist_ok kwarg,当你对已经存在的目录没问题时抑制前者。

如果您想检查 OSError 的原因,该信息位于 e.args 中的一个元组中(或可选的 e.errno 如果您只想查看错误代码):

try:
os.makedirs('/etc/python')
except OSError as e:
print e.args

(17, 'File exists')

try:
os.makedirs('/etc/stuff')
except OSError as e:
print e.args

(13, 'Permission denied')

try:
os.makedirs('/etc/stuff')
except OSError as e:
print e.errno

13

因此您必须进行一些反省,并在您的 except block 中以不同方式处理这两个错误代码。

关于python - 如何避免与 makedirs 的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com