Czy w Pythonie jest funkcja sprawdzająca, czy dany plik / katalog jest dowiązaniem symbolicznym? Na przykład dla poniższych plików powinna zwrócić moja funkcja opakowania 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
python
operating-system
Bandicoot
źródło
źródło
lnk
ios.islink('a_shortcut.lnk')
zwrotamiFalse
.IO_REPARSE_TAG_SYMLINK
).W przypadku języka Python 3.4 i nowszych można użyć klasy Path
from pathlib import Path # rpd is a symbolic link >>> Path('rdp').is_symlink() True >>> Path('README').is_symlink() False
Musisz być ostrożny używając metody is_symlink (). Zwróci True, nawet jeśli cel łącza nie istnieje, o ile nazwany obiekt jest dowiązaniem symbolicznym. Na przykład (Linux / Unix):
Następnie w bieżącym katalogu uruchom Pythona
>>> from pathlib import Path >>> Path('flnk').is_symlink() True >>> Path('flnk').exists() False
Programista musi zdecydować, czego naprawdę chce. Wygląda na to, że Python 3 zmienił nazwy wielu klas. Warto przeczytać stronę podręcznika dla klasy Path: https://docs.python.org/3/library/pathlib.html
źródło
is_symlink()
to prawda iexists()
fałsz, czego bym się spodziewał. Czy możesz podać źródło swoich obaw?is_symlink
zwracatrue
nieistniejące pliki (więcexists()
również zwracatrue
).Bez zamiaru nadużywania tego tematu, ale zostałem przekierowany na tę stronę, ponieważ szukałem linków symbolicznych, aby je znaleźć i przekonwertować na prawdziwe pliki, i znalazłem ten skrypt w bibliotece narzędzi Pythona.
#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")
źródło
mkrealfile(...)
jest na tym samym poziomie, co jego własna funkcja ...