簡體   English   中英

Python 2.6:os.rename()或os.renames()報告OSError,但文件名為None

[英]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,並且屬性設置正確。

PEP 3151可能會有所啟發 ,特別是:

由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM