hoe het volledige (absolute pad) van het doelbestand van de symbolische link of zachte link in python te vinden

wanneer ik geef
ls -l /etc/fonts/conf.d/70-yes-bitmaps.conf

lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf

dus voor een symbolische link of zachte link, hoe het volledige (absolute pad) van het doelbestand in python te vinden,

Als ik

. gebruik

os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf')

het geeft

../conf.avail/70-yes-bitmaps.conf

maar ik heb het absolute pad nodig, niet het relatieve pad, dus mijn gewenste uitvoer moet zijn,

/etc/fonts/conf.avail/70-yes-bitmaps.conf

hoe de ..te vervangen door het daadwerkelijke volledige pad van de bovenliggende map van de symbolische link of het softlink-bestand.


Antwoord 1, autoriteit 100%

os.path.realpath(path)

os.path.realpathgeeft de canonieke pad van de opgegeven bestandsnaam, waardoor alle symbolische koppelingen die in het pad worden aangetroffen, worden geëlimineerd.


Antwoord 2, autoriteit 13%

Zoals unutbu zegt, zou os.path.realpath(path)het juiste antwoord moeten zijn, waarbij het canonieke pad van de opgegeven bestandsnaam wordt geretourneerd en eventuele symbolische koppelingen naar hun doelen worden opgelost. Maar het is kapot onder Windows.

Ik heb een patch voor Python 3.2 gemaakt om deze bug te verhelpen en deze geüpload naar:

http://bugs.python.org/issue9949

Het repareert de functie realpath()in Python32\Lib\ntpath.py

Ik heb het ook op mijn server gezet, hier:

http://www.burtonsys.com/ntpath_fix_issue9949.zip

Helaas is de bug ook aanwezig in Python 2.x, en ik weet daar geen oplossing voor.


Antwoord 3, autoriteit 9%

http://docs.python.org/library /os.path.html#os.path.abspath

ook joinpath()en normpath(), afhankelijk van of je je in de huidige werkdirectory bevindt of ergens anders mee bezig bent. normpath()is misschien directer voor jou.

Specifiek:

os.path.normpath( 
  os.path.join( 
    os.path.dirname( '/etc/fonts/conf.d/70-yes-bitmaps.conf' ), 
    os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf') 
  ) 
)

Antwoord 4, autoriteit 4%

Ik raad aan om de bibliotheek pathlibte gebruiken voor bestandssysteembewerkingen.

import pathlib
x = pathlib.Path('lol/lol/path')
x.resolve()

Documentatievoor Path.resolve(strict=False): maak het pad absoluut en los eventuele symbolische links op. Er wordt een nieuw padobject geretourneerd.


Antwoord 5

In de documentatiestaat dat je os.path.join():

Het resultaat kan een absolute of relatieve padnaam zijn; als het relatief is, kan het worden geconverteerd naar een absolute padnaam met behulp van os.path.join(os.path.dirname(path), result).


Antwoord 6

In Windows 10, python 3.5, os.readlink("C:\\Users\PP")waarbij “C:\Users\PP” een symbolische link is (geen verbindingslink) werkt.

Het geeft het absolute pad naar de directory terug.

Dit werkt ook op Ubuntu 16.04, python 3.5 ook.

Other episodes