我遇到了一个奇怪的情况,似乎不同的 Python 模块(os
和 stat
vs pathlib
)识别不同的文件是否是符号链接(symbolic link)。
让我们以 python3
二进制文件为例:
paris@pk-tools:~$ ls -la /usr/bin/python3
lrwxrwxrwx 1 root root 9 Mar 23 2016 /usr/bin/python3 -> python3.5
如您所见,根据上面的shell命令,它是一个符号链接(symbolic link)。
如果我使用 pathlib
Python 3.4 引入的模块,成功识别为符号链接(symbolic link):
>>> from pathlib import Path
>>> Path('/usr/bin/python3').is_symlink()
True
现在,如果我使用 os
而不是 pathlib
和 stat
Python 模块,文件未被识别为符号链接(symbolic link):
>>> import os
>>> import stat
>>> st_mode = os.stat('/usr/bin/python3').st_mode
>>> st_mode
33261
>>> stat.S_ISLNK(st_mode)
False
我最初通过 Docker for Mac 在 Docker 容器中尝试了这个,然后在普通的 Ubuntu 16.04 中尝试了这个,结果是一样的。
知道为什么会这样吗?
谢谢!
最佳答案
os.stat
解析它的目标。当您需要有关符号链接(symbolic link)本身的信息时,请使用 os.lstat
。
这是 the documentation :
os.stat(path)
Perform the equivalent of a stat() system call on the given path. (This function follows symlinks; to stat a symlink use lstat().)
对比
os.lstat(path)
Perform the equivalent of an lstat() system call on the given path. Similar to stat(), but does not follow symbolic links. On platforms that do not support symbolic links, this is an alias for stat().
关于Python 3 不通过 stat 检测符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45358462/