簡體   English   中英

Python模塊代碼說路徑不存在,但可讀且可設定

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

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