Python 2.7 如何解决Python2.7中缺少的“exist\u ok”问题?

Python 2.7 如何解决Python2.7中缺少的“exist\u ok”问题?,python-2.7,os.path,Python 2.7,Os.path,在Python2.7上os.makedirs()缺失exist\u ok。这仅在Python3中可用 我知道这是一个工作环境: try: os.makedirs(settings.STATIC_ROOT) except OSError as e: if e.errno != errno.EEXIST: raise 我可以创建一个自定义的my\u make\u dirs()方法并使用它,而不是os.makedirs(),但这并不好 如果您被迫支持Python2.7

在Python2.7上
os.makedirs()
缺失
exist\u ok
。这仅在Python3中可用

我知道这是一个工作环境:

try:
    os.makedirs(settings.STATIC_ROOT)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise
我可以创建一个自定义的
my\u make\u dirs()
方法并使用它,而不是
os.makedirs()
,但这并不好

如果您被迫支持Python2.7,最适合Python的工作是什么


AFAIK或不会在这里起作用。

您所做的可能很好,但如果您想要检测和适应,您可以在运行时使用monkeypatch。我不会说这是最好的主意,它可能会导致一些奇怪的可能性,但取决于你的情况,也许这是好的。至少,在代码中放一些文档,以便下一个家伙或gal知道发生了什么

这里有一个这样的例子-您可以使用“true”或其他参数运行此脚本,并查看差异

使用sys.version\u info检测python的版本:


解决这个问题的一个办法是使用。它有一个,其
mkdir()
函数支持
exist\u ok

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

Path(settings.STATIC_ROOT).mkdir(exist_ok=True)
检查路径是否不存在后,可以调用makedirs():

import os

if not os.path.exists(path):
    os.makedirs(path)

接受的答案不完整,因为
os.makedirs()
以递归方式创建子文件夹,
Path.mkdir()
,如
os.mkdir()
,只能在现有位置创建新目录。另一种方法是利用抛出的异常来区分和容忍Python2/3之间的行为

import errno
import os
import os.path

def makedirs(folder, *args, **kwargs):
  try:
    return os.makedirs(folder, exist_ok=True, *args, **kwargs)
  except TypeError: 
    # Unexpected arguments encountered 
    pass

  try:
    # Should work is TypeError was caused by exist_ok, eg., Py2
    return os.makedirs(folder, *args, **kwargs)
  except OSError as e:
    if e.errno != errno.EEXIST:
      raise

    if os.path.isfile(folder):
      # folder is a file, raise OSError just like os.makedirs() in Py3
      raise

另请参见:

这看起来既干净又简单。非常感谢。对于
os.mkdirs
,您将获得bounty.set
parents=True
,这比OP的版本更糟糕,因为存在种族问题condition@AlexeiAverchenkoOP没有要求线程安全解决方案。潜在的竞争条件不会使此解决方案变得更糟或更糟。。。这只是意味着该解决方案适合于不需要并发执行的场景。对于许多python进程(例如机器学习、devops等),这是非常好的。
import errno
import os
import os.path

def makedirs(folder, *args, **kwargs):
  try:
    return os.makedirs(folder, exist_ok=True, *args, **kwargs)
  except TypeError: 
    # Unexpected arguments encountered 
    pass

  try:
    # Should work is TypeError was caused by exist_ok, eg., Py2
    return os.makedirs(folder, *args, **kwargs)
  except OSError as e:
    if e.errno != errno.EEXIST:
      raise

    if os.path.isfile(folder):
      # folder is a file, raise OSError just like os.makedirs() in Py3
      raise