2013-07-06 6 views
5

ho una directory all'interno di una directory barfoo, con il file nella directory foo_file.txtfoo e il file nella directory bar_file.txtbar; cioèPython comportamento os.path.relpath

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

Utilizzando la funzione di pitone os.path.relpath, mi aspetto:

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

che invia me:

'../bar/bar_file.txt' 

Perché:

'bar/bar_file.txt' 

Tuttavia, in realtà mi dà è questo? C'è un modo semplice per ottenere il comportamento che voglio?

EDIT: Questo è su Linux con Python 2.7.3

+1

ho capito che posso usare 'os.path.relpath ('foo/bar/bar_file.txt', os.path.dirname ('foo/foo_file.txt'))' per ottenere il risultato che voglio. Ancora curioso di sapere perché il codice originale non funziona. – jveldridge

risposta

5

os.path.relpath() presuppone che gli argomenti sono directory.

>>> 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

Grazie per la spiegazione. Poiché questo non sembra il comportamento corretto, ho presentato un errore: [http://bugs.python.org/issue18389](http://bugs.python.org/issue18389) – jveldridge

3
os.path.relpath(arg1, arg2) 

darà il percorso relativo del arg2 dalla directory di arg1. Per passare da arg2 a arg1 nel tuo caso, dovresti inserire una directory (..), andare alla directory della barra (bar), e poi al file bar_file.txt. Pertanto, il percorso relativo è

../bar/bar_file.txt 
+0

Questa è la risposta corretta. – jkdev

+1

'os.path.relpath (arg1, arg2)' fornirà il percorso relativo di ** arg1 ** dall'interno della directory di ** arg2 ** – 4Oh4