[英]Python 2.6: os.rename() or os.renames() reports OSError but filename is None
如果调用os.rename
提供不存在的文件或目录,则引发的OSError
通过将文件名设置为None
来忽略文件名。 这是2.6中的错误,已在某些更高版本中修复吗?
您只需执行以下操作即可重现该问题:
python -c 'import os ; os.rename("/tmp/abc", "/tmp/cba")'
/tmp/abc
和/tmp/cba
都不存在的地方。
我只是想知道是否应该在重发错误之前对os.rename实现一个包装程序以拦截OSError并更正filename属性。
更新资料
我实现了一个简单的测试包装器,该包装器产生了所需的行为:
$ /tmp/osrename.py
Traceback (most recent call last):
File "/tmp/osrename.py", line 26, in <module>
os.rename('/tmp/abc', '/tmp/cba')
File "/tmp/osrename.py", line 8, in __os_rename
os_rename(a, b)
OSError: [Errno 2] No such file or directory: '/tmp/abc'
这是实现:
import os, sys
def __os_rename_wrapper(os_rename):
def __os_rename(a, b):
try:
os_rename(a, b)
except OSError:
exc = sys.exc_info()[1]
if getattr(exc, 'filename', None) is None:
exc.filename = "{0} -> {1}".format(repr(a), repr(b))
raise
__os_rename.__name__ = os_rename.__name__
__os_rename.__doc__ = os_rename.__doc__
return __os_rename
os.rename = __os_rename_wrapper(os.rename)
os.rename('/tmp/abc', '/tmp/cba')
有没有办法挂接模块加载,以便可以动态应用这些修复程序?
在python 2.7.8中也发生了同样的事情,所以我想这是故意的。
但:
在Python 3.4中,如@ Random832所述,第二个属性filename2已添加到OSError,并且属性设置正确。
由于WindowsError已合并为OSError,因此OSError在Windows下获得了winerror属性。 在没有意义的情况下(例如,使用errno,filename和strerror属性的情况下)(例如,当OSError由Python代码直接引发时),将其设置为None。
及以下:
为了保持有用的兼容性,这些子类仍应为在超类上定义的各种异常属性(例如errno,filename和可选的winerror)设置足够的值。
PEP被标记为版本3.3接受。 此外3.3文档说:
对于涉及文件系统路径的异常(例如open()或os.unlink()),异常实例将包含一个附加属性filename,这是传递给函数的文件名。
目前尚不清楚为哪个功能设置属性,但基于以上内容,我会说重命名功能肯定包含文件名,因此应设置filename属性。
如果您发现与此有关的任何其他PEP,请随时添加。
我目前能想到的唯一原因是,在重命名功能中,您使用了两个文件名,因此可能不清楚在异常文件名属性上设置哪个文件名(对此有何想法?)。
如果您需要设置值,那么至少在我看来,有关属性校正的解决方案是可行的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.