如何解决 Python 2.7 上缺少的 `exist_ok`?
How to workaround `exist_ok` missing on Python 2.7?
上 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
我可以创建自定义 my_make_dirs()
方法并使用它,而不是 os.makedirs()
,但这并不好。
如果你被迫支持 Python 2.7,最 pythonic 的解决方法是什么?
AFAIK python-future or six 在这里帮不上忙。
你正在做的可能没问题,但如果你想检测和适应,你可以在 运行 时间进行 monkeypatch。我不会说这是最好的主意,它可能会导致一些奇怪的后果,但取决于您的情况,也许没关系。至少,在这段代码中和周围放置一些文档,以便下一个人或女孩知道发生了什么。
这是一个例子 - 您可以 运行 使用 "true" 或其他参数作为参数的脚本,然后查看区别。
使用sys.version_info检测python的版本:https://docs.python.org/2/library/sys.html#sys.version_info
https://docs.python.org/3/library/sys.html#sys.version_info
import sys
import os
def blah(a):
return "lskdflsdkfj"
if sys.argv[1] == "true":
os.listdir = blah
print(os.listdir('.'))
一种绕过它的方法是使用 pathlib. It has a backport for 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)
正如评论所建议的那样,parents=True
用于 makedirs()
。
Path(settings.STATIC_ROOT).mkdir(exist_ok=True, parents=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
另见:Python "FileExists" error when making directory
上 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
我可以创建自定义 my_make_dirs()
方法并使用它,而不是 os.makedirs()
,但这并不好。
如果你被迫支持 Python 2.7,最 pythonic 的解决方法是什么?
AFAIK python-future or six 在这里帮不上忙。
你正在做的可能没问题,但如果你想检测和适应,你可以在 运行 时间进行 monkeypatch。我不会说这是最好的主意,它可能会导致一些奇怪的后果,但取决于您的情况,也许没关系。至少,在这段代码中和周围放置一些文档,以便下一个人或女孩知道发生了什么。
这是一个例子 - 您可以 运行 使用 "true" 或其他参数作为参数的脚本,然后查看区别。
使用sys.version_info检测python的版本:https://docs.python.org/2/library/sys.html#sys.version_info https://docs.python.org/3/library/sys.html#sys.version_info
import sys
import os
def blah(a):
return "lskdflsdkfj"
if sys.argv[1] == "true":
os.listdir = blah
print(os.listdir('.'))
一种绕过它的方法是使用 pathlib. It has a backport for 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)
正如评论所建议的那样,parents=True
用于 makedirs()
。
Path(settings.STATIC_ROOT).mkdir(exist_ok=True, parents=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
另见:Python "FileExists" error when making directory