web-dev-qa-db-fra.com

Comment faire un chemin de fichier "toujours relatif au module courant"?

Disons que vous avez un module qui contient

myfile = open('test.txt', 'r')

Et le fichier 'test.txt' se trouve dans le même dossier. Si vous exécutez le module, le fichier sera ouvert avec succès.

Supposons maintenant que vous importiez ce module à partir d'un autre qui se trouve dans un autre dossier. Le fichier ne sera pas recherché dans le même dossier que le module où se trouve ce code.

Alors, comment faire en premier les fichiers de recherche de modules avec des chemins relatifs dans le même dossier?

Il existe différentes solutions en utilisant "__file__" Ou "os.getcwd()", mais j'espère qu'il existe une méthode plus propre, comme le même caractère spécial dans la chaîne que vous passez pour ouvrir () ou fichier ().

55
user975135

La solution consiste à utiliser __file__ et c'est assez propre:

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
50
yak

Pour les modules normaux chargés à partir de .py fichiers, les __file__ doit être présent et utilisable. Pour joindre les informations de __file__ sur votre chemin relatif, il existe une option plus récente que os.path interfaces disponibles depuis 2014:

from pathlib import Path

here = Path(__file__).parent
with (here/'test.txt').open() as myfile:
    ...

pathlib a été ajouté à Python dans 3.4 - voir PEP428 . Pour les utilisateurs toujours sur Python 2.7 souhaitant utiliser les mêmes API, un le backport est disponible .

Les utilisateurs intéressés à appliquer les approches les plus modernes disponibles devraient envisager de passer à importlib-resources plutôt que de joindre des fichiers de données relatifs à l'arborescence source. Actuellement, peu d'utilisateurs ont le luxe de restreindre la compatibilité à Python 3.7+ uniquement, donc je mentionne cela comme un avertissement à ceux qui aiment être à la pointe de la technologie.

8
wim