Python 3 不通过 stat 检测符号链接(symbolic link)

标签 python linux python-3.x ubuntu filesystems

我遇到了一个奇怪的情况,似乎不同的 Python 模块(osstat 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 而不是 pathlibstat 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/

相关文章:

python - Matplotlib 2.2.2 无法 xkcdify 绘图

python - 如何在Python爬虫中访问多页面表单的发布数据

Python 3 在系统调用中转义引号

c - openssl:使用 3gpp testvectors 的 128 位 key 的 c 中 aes ctr 方法的解密输出问题

c - 使用 XCode 构建、分析、编辑 unix\linux 控制台程序

Python类从父级运行方法,但保留变量

Python 模拟 strptime 行为

python - 如何使 QPushButton 成为加载按钮?

python - 给定一个数组,找到满足以下等式的四个唯一整数

linux - 进程在收到 SIGTERM 后应该多快退出?