Compruebe si el archivo es enlace simbólico en Python

En Python, ¿hay una función para verificar si un archivo / directorio dado es un enlace simbólico? Por ejemplo, para los archivos a continuación, mi función de envoltorio debería devolver 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 

Para determinar si una entrada de directorio es un enlace simbólico use esto:

os.path.islink (ruta)

Devuelva True si la ruta se refiere a una entrada de directorio que es un enlace simbólico. Siempre Falso si los enlaces simbólicos no son compatibles.

Por ejemplo, dado:

 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 

Para Python 3.4 y superiores, puedes usar la clase Path.

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

Debes tener cuidado al usar el método is_symlink (). Devolverá Verdadero incluso si el objective del enlace no existe mientras el objeto nombrado sea un enlace simbólico. Por ejemplo (Linux / Unix):

 ln -s ../nonexistentfile flnk 

Entonces, en su directorio actual, inicie python.

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

El progtwigdor tiene que decidir lo que realmente quiere. Python 3 parece haber cambiado el nombre de muchas clases. Podría valer la pena leer la página del manual de la clase Ruta: https://docs.python.org/3/library/pathlib.html

Sin la intención de inflar este tema, pero fui redirigido a esta página porque estaba buscando enlaces simbólicos para encontrarlos y convertirlos en archivos reales y encontrar este script dentro de la biblioteca de herramientas de 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")