Convertir le nom de fichier à un chemin canonique en utilisant os.path.realpath
, obtenir la partie du répertoire, et voir si le répertoire courant (sous forme canonique) est un préfixe de cette:
import os, os.path
def in_cwd(fname):
path = os.path.dirname(os.path.realpath(fname))
return path.startswith(os.getcwd())
En convertissant fname
à un chemin canonique nous traitons les liens symboliques et les chemins contenant ../
.
Mise à jour
Malheureusement, le code ci-dessus a un petit problème. Par exemple,
'/a/b/cd'.startswith('/a/b/c')
retours True
, mais nous avons certainement ne voulons que le comportement ici! Heureusement, il y a une solution facile: il suffit d'ajouter os.sep
aux chemins avant d'effectuer le test de préfixe. La nouvelle version gère également tous les problèmes d'insensibilité à la casse du système d'exploitation via os.path.normcase
.
import os, os.path
def clean_dirname(dname):
dname = os.path.normcase(dname)
return os.path.join(dname, '')
def in_cwd(fname):
cwd = clean_dirname(os.getcwd())
path = os.path.dirname(os.path.realpath(fname))
path = clean_dirname(path)
return path.startswith(cwd)
Merci à DSM pour signalé la faille dans le code précédent.
Voici une version un peu plus efficace. Il utilise os.path.commonpath
, ce qui est plus robuste que l'ajout de os.sep
et de faire un test de préfixe de chaîne.
def in_cwd(fname):
cwd = os.path.normcase(os.getcwd())
path = os.path.normcase(os.path.dirname(os.path.realpath(fname)))
return os.path.commonpath((path, cwd)) == cwd
qu'en est-il de https://docs.python.org/3/library/pathlib.html#pathlib.Path.resolve? –