Python 2.7 如何解决Python2.7中缺少的“exist\u ok”问题?
在Python2.7上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
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.setparents=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