Python 2.6:os.rename()或os.renames()报告OSError,但filename
如果调用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可能会有所启发,特别是:
及以下:
PEP标记为3.3版已被接受.
对于属性设置的函数并不完全清楚,但基于上面我会说重命名函数肯定涉及文件名,因此应该设置filename属性. 如果您发现任何其他PEP,请随时添加. 我现在能想到的唯一原因是在重命名函数中你使用了两个文件名,因此可能不清楚在异常文件名属性上设置哪一个(对此有什么想法?). 如果您需要设置值,至少在我看来,您的关于属性更正的解决方案是可行的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |