2011-10-16 18 views
113

Desidero ottenere il percorso della directory corrente in cui è in esecuzione il file .py.os.path.dirname (__ file__) restituisce vuoto

un semplice file D:\test.py con il codice:

import os 

print os.getcwd() 
print os.path.basename(__file__) 
print os.path.abspath(__file__) 
print os.path.dirname(__file__) 

E 'cablato che l'uscita è:

D:\ 
test.py 
D:\test.py 
EMPTY 

mi aspetto gli stessi risultati del getcwd() e path.dirname().

Dato os.path.abspath = os.path.dirname + os.path.basename, perché

os.path.dirname(__file__) 

ritorna vuoto?

risposta

183

Perché os.path.abspath = os.path.dirname + os.path.basename non contiene. abbiamo invece abbiamo

os.path.dirname(filename) + os.path.basename(filename) == filename 

Sia dirname() e basename() dividere solo il nome del file passato in componenti senza prendere in considerazione la directory corrente. Se si desidera considerare anche la directory corrente, è necessario farlo in modo esplicito.

Per ottenere il dirname del percorso assoluto, utilizzare

os.path.dirname(os.path.abspath(__file__)) 
+3

Ciao Sven, hai ragione, dovrebbe essere os.path.dirname (os.path.abspath (__ file__)). Grazie! Solo FYI, si ottiene un piccolo refuso nell'ultima riga. – Flake

+8

nota che il commento precedente ha un grassetto in cui dovrebbe essere sottolineata su entrambi i lati a causa della formattazione del markdown. la risposta originale è stata modificata correttamente – watsonic

+1

Nota che non abbiamo mai "os.path.dirname (nome file) + os.path.basename (filename) == nomefile" perché manca il separatore di directory. Abbiamo piuttosto: 'os.path.join (os.path.dirname (nome file), os.path.basename (nome file)) == nomefile' –

3
print(os.path.join(os.path.dirname(__file__))) 

È anche possibile utilizzare questo modo

1
import os.path 

dirname = os.path.dirname(__file__) or '.' 
6

può essere utilizzato anche come quella:

dirname(dirname(abspath(__file__))) 
+0

@Svizzera La risposta di Marnach funziona, ma questo sembra molto più pulito. – lordB8r

3
os.path.split(os.path.realpath(__file__))[0] 

os.path.realpath(__file__) restituisce abspath dello script corrente; os.path.split (abspath) [0] restituisce la dir corrente

Problemi correlati