在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
Answers:
要确定目录条目是否为符号链接,请使用以下命令:
如果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
IO_REPARSE_TAG_SYMLINK
)。
对于python 3.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):
ln -s ../nonexistentfile flnk
然后,在当前目录中启动python
>>> from pathlib import Path
>>> Path('flnk').is_symlink()
True
>>> Path('flnk').exists()
False
程序员必须决定他/她真正想要什么。Python 3似乎已经重命名了许多类。可能值得阅读Path类的手册页:https : //docs.python.org/3/library/pathlib.html
is_symlink()
是正确的,exists()
也是错误的,这就是我所期望的。您能否提供您担心的消息来源?
is_symlink
正在返回true
不存在的文件(因此exists()
也返回true
)。
不想膨胀这个话题,但是当我在寻找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")
lnk
,并os.islink('a_shortcut.lnk')
返回False
。