How to check if file is a symlink in Python?

在 Python 中,是否有检查给定文件/目录是否为符号链接的函数?例如,对于以下文件,我的包装函式应该返回 True

# ls -l
total 0
lrwxrwxrwx 1 root root 8 2012-06-16 18:58 dir -> ../temp/
lrwxrwxrwx 1 root root 6 2012-06-16 18:55 link -> ../log
106706 次浏览

要确定目录条目是否是符号链接,请使用以下步骤:

os.path.islink(path)

如果 path 引用的目录条目是一个符号,则返回 True 如果不支持符号链接,则始终为 False。

例如:

drwxr-xr-x   2 root root  4096 2011-11-10 08:14 bin/
drwxrwxrwx   1 root root    57 2011-07-10 05:11 initrd.img -> boot/initrd.img-2..


>>> import os.path
>>> os.path.islink('initrd.img')
True
>>> os.path.islink('bin')
False

对于 python3.4 + ,可以使用 Path

from pathlib import Path




# rpd is a symbolic link
>>> Path('rdp').is_symlink()
True
>>> Path('README').is_symlink()
False

使用 is_symlink()方法时必须小心。只要命名的对象是符号链接,它就会返回 True,即使链接的目标不存在。

For example (Linux/Unix):

ln -s ../nonexistentfile flnk

然后,在你的工作目录:

>>> from pathlib import Path
>>> Path('flnk').is_symlink()
True
>>> Path('flnk').exists()
False

程序员必须决定他们真正想要的是什么。Python 3似乎重命名了很多类。可能值得阅读 Path 类的手册页: https://docs.python.org/3/library/pathlib.html

我并不想夸大这个主题,但是我被重定向到这个页面,因为我正在寻找 symlink,以找到它们并将它们转换为真正的文件,并在 python 工具库中找到了这个脚本。

#Source https://github.com/python/cpython/blob/master/Tools/scripts/mkreal.py




import sys
import os
from stat import *


BUFSIZE = 32*1024


def mkrealfile(name):
st = os.stat(name) # Get the mode
mode = S_IMODE(st[ST_MODE])
linkto = os.readlink(name) # Make sure again it's a symlink
f_in = open(name, 'r') # This ensures it's a file
os.unlink(name)
f_out = open(name, 'w')
while 1:
buf = f_in.read(BUFSIZE)
if not buf: break
f_out.write(buf)
del f_out # Flush data to disk before changing mode
os.chmod(name, mode)


mkrealfile("/Users/test/mysymlink")