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?

Flocon
la source

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__))
Sven Marnach
la source
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__)))
adnan dogar
la source
7
import os.path

dirname = os.path.dirname(__file__) or '.'
Deve
la source
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

RY Zheng
la source
5
print(os.path.join(os.path.dirname(__file__))) 

Vous pouvez également utiliser de cette façon

Mikhail
la source