如果您调用
您可以通过简单地执行以下操作来重现此问题:
有没有一种方法可以钩住模块加载,以便可以动态地应用这些修复呢?
os.rename
提供的文件或目录不存在,则引发的OSError
将通过将其设置为None
来省略文件名。这是2.6中存在的错误吗?是否已在某些较新版本中解决?您可以通过简单地执行以下操作来重现此问题:
python -c 'import os ; os.rename("/tmp/abc", "/tmp/cba")'
当既不存在/tmp/abc
,也不存在/tmp/cba
时。
我在思考是否应该实现一个包装器来拦截OSError并在重新发送错误之前更正文件名属性。
更新
我实现了一个简单的测试包装器,它产生了期望的行为:
$ /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')
有没有一种方法可以钩住模块加载,以便可以动态地应用这些修复呢?
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/abc' -> '/tmp/cba'
。该错误本身还显示了正确的filename
和filename2
属性。所以看起来已经修复了? - user2124834os.exists
,其中 errno 是ENOEXIST
。 - Craig