[英]Python module code says path doesn't exist but is readable and statable
我在python模塊中遇到了一個非常奇怪的問題,我不確定這是否是由於python怪異或Windows中的某些損壞或文件系統處於怪異狀態引起的。
這是問題所在:我正在使用的模塊會創建一些輸入到指定目錄的輸出,如果該目錄不存在,則會創建該目錄。 如果您運行一次,然后再次運行它,則模塊認為該目錄不存在,嘗試創建該目錄,然后以“當該文件已存在時無法創建文件”的錯誤炸彈,這將很好地工作。
所以,我去挖了。 在我的主腳本中,我可以在目錄上運行os.path.exists,它說它存在就可以了。 在模塊中,相同的確切代碼返回false。 同樣在模塊中,如果我執行os.access( path ,os.R_OK),則返回true,表示該路徑可讀;如果執行os.stat( path ),則返回文件信息,表明該路徑存在。
如果我在python shell中手動運行相同的代碼,則一切正常,表示路徑存在,等等。
這是一些代碼和輸出:
在我的主腳本中:
print('Path {} exists: {} - readable: {} - stat: {}',
filename,
os.path.exists(filename),
os.access(filename, os.R_OK),
os.stat(filename))
輸出:
File testoutput exists: True - readable: True - stat: nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1508458382L, st_mtime=1508458382L, st_ctime=1508458382L)
在模塊內部,相同的代碼:
File testoutput exists: False - readable: True - stat: nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid=0, st_size=0L, st_atime=1508458382L, st_mtime=1508458382L, st_ctime=1508458382L)
這里到底發生了什么? 模塊代碼是否在具有不同權限的某種不同上下文中運行? 我的文件系統是否以某種奇怪的方式損壞了?
另外,我應該提到所有這些都是在高架cmd外殼中完成的,所以這不是問題。
解決了:
原來,這是一些猴子補丁os.path.exists的中間代碼,最有用的工具是使用反射和“檢查”模塊來找出代碼的實際來源,特別是:
print('os.path: {} - {} - {} - {}'.format(os.__file__, os.path.__name__, os.path.__file__, os.path.exists.__module__))
print(inspect.getsource(os.path.exists))
__module__信息告訴我monkeypatching在哪里發生。
這只是有根據的猜測。 對於斷開的符號鏈接, os.path.exists
將返回False
,而os.access
將報告文件本身(符號鏈接)為可讀。 您的文件是否可能是符號鏈接?
另一個區別是os.access
將使用實際的(無效的)uid / gid來測試可讀性,而os.path.exists
使用的是有效的uid / gid。 模塊之間的用戶ID是否可能更改?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.