2013-07-06 9 views
5

Mam katalogu bar wewnątrz katalogu foo, z pliku w katalogu foofoo_file.txt i złożyć bar_file.txt w katalogu bar; tjPython zachowanie os.path.relpath

computer$ ls 
foo/ 
computer$ ls foo/ 
bar/ foo_file.txt 
computer$ ls foo/bar/ 
bar_file.txt 

Korzystanie z funkcji python os.path.relpath, spodziewam:

os.path.relpath('foo/bar/bar_file.txt', 'foo/foo_file.txt') 

dać mi:

'bar/bar_file.txt' 

jednak rzeczywiście daje mi:

'../bar/bar_file.txt' 

Dlaczego czy to jest? Czy istnieje łatwy sposób na uzyskanie pożądanego zachowania?

EDIT: Jest to na Linux z Python 2.7.3

+1

zdałem sobie sprawę, mogę użyć 'os.path.relpath ('foo/bar/bar_file.txt', os.path.dirname ('foo/foo_file.txt'))' aby uzyskać pożądany rezultat. Nadal ciekawi, dlaczego oryginalny kod nie działa. – jveldridge

Odpowiedz

5

os.path.relpath() zakłada, że ​​jej argumenty są katalogi.

>>> os.path.join(os.path.relpath(os.path.dirname('foo/bar/bar_file.txt'), 
     os.path.dirname('foo/foo_file.txt')), 
     os.path.basename('foo/bar/bar_file.txt')) 
'bar/bar_file.txt' 
+0

Dzięki za wyjaśnienie. Ponieważ nie wydaje się to prawidłowym zachowaniem, zgłosiłem błąd: [http://bugs.python.org/issue18389](http://bugs.python.org/issue18389) – jveldridge

3
os.path.relpath(arg1, arg2) 

daje względną ścieżkę arg2 z katalogu arg1. Aby dostać się z arg2 do arg1 w twoim przypadku, musisz zamknąć jeden katalog (..), przejść do katalogu (paska), a następnie pliku bar_file.txt. Dlatego, względna ścieżka jest

../bar/bar_file.txt 
+0

To jest poprawna odpowiedź. – jkdev

+1

'os.path.relpath (arg1, arg2)' poda względną ścieżkę ** arg1 ** z katalogu ** arg2 ** – 4Oh4