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

Ban*_*oot 81 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
Run Code Online (Sandbox Code Playgroud)

Lev*_*von 121

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

os.path.islink(路径)

如果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
Run Code Online (Sandbox Code Playgroud)

  • 并且islink()不适用于Windows符号链接,即联结.所以答案仅适用于Unix. (8认同)
  • 在Windows上,_Shortcuts_显示为扩展名为`lnk`的文件,而`os.islink('a_shortcut.lnk')`返回`False`. (6认同)
  • @EvgeniSergeev 那是因为它们只是文件 - 可能是 Windows 9x 天的宿醉,当时唯一的文件系统是 FAT/FAT32。有关所有类型的符号/硬链接和目录,请参见 http://superuser.com/questions/347930/what-are-the-various-link-types-in-windows-how-do-i-create-them NTFS 支持的连接。也就是说,我仍然认为 Python 不支持它们。 (2认同)
  • 如果您需要Windows解决方案,请参阅此http://stackoverflow.com/questions/27972776/having-trouble-implementing-a-readlink-function答案. (2认同)
  • @TheGodfather:目录连接不是符号链接(“IO_REPARSE_TAG_SYMLINK”)。 (2认同)

Kem*_*hou 9

对于python 3.4及更高版本,您可以使用Path类

from pathlib import Path


# rpd is a symbolic link
>>> Path('rdp').is_symlink()
True
>>> Path('README').is_symlink()
False
Run Code Online (Sandbox Code Playgroud)

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

ln -s ../nonexistentfile flnk
Run Code Online (Sandbox Code Playgroud)

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

>>> from pathlib import Path
>>> Path('flnk').is_symlink()
True
>>> Path('flnk').exists()
False
Run Code Online (Sandbox Code Playgroud)

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

  • @Sheljohn 在我的评论不存在()不是答案的一部分之前检查对此答案的编辑。使用存在是我的意思的额外检查。因为根据原始版本,单独使用 is_symlink 是不够的。 (2认同)

use*_*754 6

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

  • 你能解释一下这里发生了什么吗?它看起来有点奇怪,因为您似乎在*实际写回文件之前*删除(取消链接)该文件。怎么会这样?最后一个 `mkrealfile(...)` 与它自己的函数处于同一级别...... (3认同)