请考虑在命令行中执行以下设置:
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中是否存在断开的符号链接的正确方法是什么?
2条答案
按热度按时间yjghlzjz1#
请注意,当符号链接指向一个不存在的文件时,
exists()
所做的正是文档所说的。注如果路径指向符号链接,exists()将返回符号链接是否指向现有文件或目录。
几乎每个函数在给定一个损坏的符号链接时都会返回
false
,从某种意义上说,这个文件实际上并不存在。file.is_symlink() or file.exists()
会做你想让它做的事情吗?c6ubokkw2#
要检查是否存在 anything,包括一个断开的符号链接,最好使用
lstat
方法:另外,这还避免了基于
exists
的方法可能遇到的一系列TOCTOU竞争条件。