[英]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.