2010-07-10 13 views
45

Kiedy daję ls -l /etc/fonts/conf.d/70-yes-bitmaps.confjak znaleźć pełną ścieżkę (bezwzględną) plik docelowego symbolicznego łącza lub miękkiej ogniwo pytona

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

więc dla dowiązania symbolicznego lub miękkiej linku, jak znaleźć pełną ścieżkę (bezwzględną) docelowego pliku w Pythonie,

Jeśli używam

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

wyprowadza

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

ale potrzebuję absolutnej ścieżka nie ścieżka względna, więc moja pożądane wyjście musi być

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

jak wymienić .. z rzeczywistą pełną ścieżkę do katalogu nadrzędnego dowiązania symbolicznego lub miękkiego pliku linku.

Odpowiedz

8

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

również joinpath i normpath, w zależności od tego, czy jesteś w bieżącym katalogu roboczym, czy pracujesz z rzeczy gdzie indziej. normpath może być bardziej bezpośredni dla Ciebie.

Aktualizacja:

szczególności:

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') 
) 
) 
+2

Uważajcie jednak: należy podać ścieżkę, która nie jest dowiązaniem do readlink będzie się gniewać i dać następujący wyjątek: 'OSError: [ERRNO 22 ] Nieprawidłowy argument: "twoja-ścieżka" ' – Diego

76
os.path.realpath(path) 

os.path.realpath zwraca kanoniczną ścieżkę określonego pliku, eliminując wszelkie dowiązania symboliczne napotkane na drodze.

+1

os.path.realpath nie eliminuje dowiązań symbolicznych w Pythonie 3.2 w Windows 7. (Błąd?) –

+1

Hmmm ... Widzę, że to był otwarty błąd przez 1,5 roku: http://bugs.python.org/issue9949 –

+1

Tak, pojawia się ten sam problem, 3 lata później: c – Coburn

12

Jak mówi unutbu, ścieżka do ścieżki (ścieżka) powinna być właściwą odpowiedzią, zwracając kanoniczną ścieżkę podanego pliku, rozwiązując wszelkie dowiązania symboliczne do swoich celów. Ale jest uszkodzony w systemie Windows.

Utworzyłem poprawkę dla Pythona 3.2, aby naprawić ten błąd, i wysłał go do:

http://bugs.python.org/issue9949

Ustaliła ona funkcję realpath w Python32 \ lib \ ntpath.py

I zostały również umieścić go na moim serwerze, tu:

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

Niestety, błąd jest obecny w Py również w wersji 2.x i nie wiem, jak to naprawić.

0

documentation mówi używać os.path.join():

The result may be either an absolute or relative pathname; if it is relative, it may be converted to an absolute pathname using os.path.join(os.path.dirname(path), result) .