python pathlib.Path.exists对断开的符号链接返回False

mfuanj7w  于 2023-02-15  发布在  Python
关注(0)|答案(2)|浏览(125)

请考虑在命令行中执行以下设置:

touch test.txt
ln -s test.txt test.lnk
rm test.txt

所以我们有一个指向已删除文件的符号链接。现在在Python中:

import pathlib
p = pathlib.Path('test.lnk')
p.is_symlink()  # True
p.exists()  # False

Python告诉我“test.lnk是一个符号链接,但它并不存在......”
因此,我无法正确检查目录中是否存在名为test.lnk的内容:

if not p.exists():
    p.symlink_to('another_file')
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib/python3.8/pathlib.py", line 1384, in symlink_to
#     self._accessor.symlink(target, self, target_is_directory)
#   File "/usr/lib/python3.8/pathlib.py", line 446, in symlink
#     return os.symlink(a, b)
# FileExistsError: [Errno 17] File exists: 'another_file' -> 'test.lnk'

我该如何解决这个问题?检查Python中是否存在断开的符号链接的正确方法是什么?

yjghlzjz

yjghlzjz1#

请注意,当符号链接指向一个不存在的文件时,exists()所做的正是文档所说的。
注如果路径指向符号链接,exists()将返回符号链接是否指向现有文件或目录。
几乎每个函数在给定一个损坏的符号链接时都会返回false,从某种意义上说,这个文件实际上并不存在。
file.is_symlink() or file.exists()会做你想让它做的事情吗?

c6ubokkw

c6ubokkw2#

要检查是否存在 anything,包括一个断开的符号链接,最好使用lstat方法:

try:
    file.lstat()
except FileNotFoundError:
    # file doesn't exist, for real this time!
    ...

另外,这还避免了基于exists的方法可能遇到的一系列TOCTOU竞争条件。

相关问题