检查文件是否为python中的符号链接

检查文件是否为python中的符号链接,python,operating-system,Python,Operating System,在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 要确定目录项是否为符号链接,请使用以下命令: 如果路径引用的目录项是符号项,则返回True 链接如果不

在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

要确定目录项是否为符号链接,请使用以下命令:

如果路径引用的目录项是符号项,则返回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。例如(Linux/Unix):

然后,在当前目录中启动python

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

程序员必须决定他/她真正想要什么。Python3似乎已经重命名了很多类。阅读Path类的手册页面可能是值得的:

,但我无意夸大这个主题,但我被重定向到了这个页面,因为我正在寻找符号链接来找到它们并将它们转换为真实的文件,并且在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")

在Windows上,快捷方式显示为扩展名为
lnk
的文件,而
os.islink('a_shortcut.lnk')
返回
False
@EvgeniSergeev,这是因为它们只是文件-可能是Windows 9x时代的遗留问题,当时唯一的文件系统是FAT/FAT32。有关NTFS上支持的所有类型的符号/硬链接和目录连接,请参见此。也就是说,我仍然认为Python不支持它们,而islink()不适用于Windows符号链接,即连接。因此,此答案仅适用于Unix。如果需要Windows解决方案,请参考此答案。@教父:目录连接不是符号链接(
IO\u repasse\u TAG\u symlink
)。这可能只找到有效的符号链接,可能无法识别符号链接文件,但已断开。因此,如果要筛选真实文件或所有符号链接(好的和坏的),请确保执行其他操作checks@2114L3有效但已断开的符号链接是什么意思?从一个断开符号链接的简单测试来看,似乎
is_symlink()
是真的,
exists()
是假的,这是我所期望的。你能为你的担忧提供一个来源吗?@Sheljohn在我的评论出现之前检查这个答案的编辑()不是答案的一部分。使用exists是一个额外的检查,我的意思是。按照原始版本,单独使用is_符号链接是不够的。在Windows上,这对我来说不正常:
is_符号链接
对于不存在的文件返回
true
(因此
exists()
也返回
true
)。你能解释一下这里发生了什么吗?这看起来有点奇怪,因为在实际写回文件之前,您正在删除(取消链接)文件。这怎么可能?最后一个
mkrealfile(…)
与它自己的函数处于同一级别上。。。
#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")