Python — os.path.exists("~/something") retourne toujours False

Strange fact que je viens de découvrir dans Python1.

La méthode os.path.exists() retourne toujours False quand l'argument commence par un ~.

>>> import os.path
>>> os.path.exists("~/.my.cnf")
False

Il faut utiliser la méthode os.path.expanduser() pour remplacer le ~ par le contenu de la variable $HOME — et ainsi obtenir un chemin absolu — pour que le résultat de la méthode soit correct.

>>> os.path.expanduser("~/.my.cnf")
'/home/quack/.my.cnf'
>>> os.path.exists(os.path.expanduser("~/.my.cnf"))
True

Selon la documentation, le problème pourrait provenir d'un appel à la méthode os.stat, même si celle si ne génère pas d'autre erreur que « OSError: [Errno 2] No such file or directory: '~/.my.cnf' » dans mon shell.

Bizarre. À l'avenir, je saurais que le problème peut venir de là !

===

EDIT 04/09/2014

La raison de cette particularité est en fait beaucoup plus simple. Le symbole ~ est un caractère qui est substitué par un shell. Or, dans ce cas présent, aucun shell n'est appelé. Donc la méthode Python os.path.exists cherche le fichier .my.cnf dans le dossier ~, qui n'existe pas sur le système. D'où la nécessité d'utiliser os.path.expanduser() pour demander à Python d'effectuer la substitution.

Merci aux commentaires et aux réponses sur Twitter qui m'ont expliqué tout ça ! :)


  1. Ici en version 2.7.6 sur une xUbuntu. Le bug est le même sur Python 3.4.0 

Vus : 897
Publié par Quack1 : 122