如何绕过Python 2.7上缺少的`exist_ok`?

gue*_*tli 18 python-2.7 os.path

在Python 2.7 os.makedirs()上缺少exist_ok.这仅适用于Python 3.

我知道这是一项有效的工作:

try:
    os.makedirs(settings.STATIC_ROOT)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise
Run Code Online (Sandbox Code Playgroud)

我可以创建一个自定义my_make_dirs()方法并使用它,而不是os.makedirs(),但这不是很好.

如果你被迫支持Python 2.7,最诡计多端的工作是什么?

AFAIK python-future或者6将无法帮到这里.

kic*_*hik 15

解决它的一种方法是使用pathlib.它有一个Python 2后端及其mkdir()功能支持exist_ok.

try:
  from pathlib import Path
except ImportError:
  from pathlib2 import Path  # python 2 backport

Path(settings.STATIC_ROOT).mkdir(exist_ok=True)
Run Code Online (Sandbox Code Playgroud)

  • 为`os.mkdirs`设置`parents = True` (3认同)

Pat*_*ron 11

You could call makedirs() after checking that the path does not exist:

import os

if not os.path.exists(path):
    os.makedirs(path)
Run Code Online (Sandbox Code Playgroud)

  • 由于竞争条件,这比 OP 的版本更糟糕 (5认同)
  • @AlexeiAverchenko OP 没有要求线程安全的解决方案。潜在的竞争条件不会使该解决方案变得更糟或更糟......它只是意味着该解决方案适合不期望并发执行的场景。对于许多 python 进程(例如机器学习、devops 等)来说,这非常好。 (3认同)