加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python 2.6:os.rename()或os.renames()报告OSError,但filename

发布时间:2020-12-20 13:49:16 所属栏目:Python 来源:网络整理
导读:如果调用os.rename提供不存在的文件或目录,则引发的OSError会通过将其设置为None来省略文件名.这是2.6中的一个错误,已在某个更高版本中得到修复? 您只需执行以下操作即可重现此问题: python -c 'import os ; os.rename("/tmp/abc","/tmp/cba")' 既不存在/
如果调用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中,第二个属性filename2被添加到OSError,如@Random832所述,并且属性设置正确.

这个PEP 3151可能会有所启发,特别是:

Since WindowsError is coalesced into OSError,the latter gains a
winerror attribute under Windows. It is set to None under situations
where it is not meaningful,as is already the case with the errno,
filename and strerror attributes (for example when OSError is raised
directly by Python code).

及以下:

In order to preserve useful compatibility,these subclasses should
still set adequate values for the various exception attributes defined
on the superclass (for example errno,filename,and optionally
winerror ).

PEP标记为3.3版已被接受.
此外,3.3文档说:

For exceptions that involve a file system path (such as open() or
os.unlink()),the exception instance will contain an additional
attribute,which is the file name passed to the function.

对于属性设置的函数并不完全清楚,但基于上面我会说重命名函数肯定涉及文件名,因此应该设置filename属性.

如果您发现任何其他PEP,请随时添加.

我现在能想到的唯一原因是在重命名函数中你使用了两个文件名,因此可能不清楚在异常文件名属性上设置哪一个(对此有什么想法?).

如果您需要设置值,至少在我看来,您的关于属性更正的解决方案是可行的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读