os.path.dirname (__ file__) renvoie vide


165

Je veux obtenir le chemin du répertoire actuel sous lequel un fichier .py est exécuté.

Par exemple un simple fichier D:\test.pyavec du code:

import os

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

Il est étrange que la sortie soit:

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

J'attends les mêmes résultats de getcwd()et path.dirname().

Étant donné os.path.abspath = os.path.dirname + os.path.basename, pourquoi

os.path.dirname(__file__)

retourne vide?

Réponses:


257

Parce os.path.abspath = os.path.dirname + os.path.basenameque ne tient pas. nous avons plutôt

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

Les deux dirname()et basename()seulement divisent le nom de fichier passé en composants sans prendre en compte le répertoire actuel. Si vous souhaitez également prendre en compte le répertoire courant, vous devez le faire explicitement.

Pour obtenir le nom du chemin absolu, utilisez

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

3
Salut Sven, vous avez raison, cela devrait être os.path.dirname (os.path.abspath ( fichier )). Merci! Juste pour info, vous obtenez une petite faute de frappe dans la dernière ligne.
Flake

11
notez que le commentaire ci-dessus est en gras là où il devrait y avoir un soulignement des deux côtés en raison du formatage de démarque. la réponse originale a été modifiée correctement
watsonic

1
Notez que nous ne l'avons jamais fait os.path.dirname(filename) + os.path.basename(filename) == filenamecar le séparateur de répertoire est manquant. On a plutôt:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul

Je suis confus, devez-vous laisser basedir = os.path.abspath (os.path.dirname ( fichier )) dans votre programme? ou que remplacez-vous ou où remplacer votre chemin comme C: \ Users \ Test \ app.db?
0004

@ pes04 se __file__développe au nom du fichier actuel, vous pouvez donc utiliser une copie textuelle du code de cette réponse.
Sven Marnach

9

peut être utilisé aussi comme ça:

dirname(dirname(abspath(__file__)))

7
import os.path

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

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

os.path.realpath(__file__)retourne l'abspath du script courant; os.path.split (abspath) [0] renvoie le répertoire actuel


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

Vous pouvez également utiliser de cette façon

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.