J'avais l'habitude d'ouvrir des fichiers qui se trouvaient dans le même répertoire que le script Python en cours d'exécution en utilisant simplement une commande comme
open("Some file.txt", "r")
Cependant, j'ai découvert que lorsque le script était exécuté sous Windows en double-cliquant dessus, il tentait d'ouvrir le fichier à partir du mauvais répertoire.
Depuis, j'ai utilisé une commande du formulaire
open(os.path.join(sys.path[0], "Some file.txt"), "r")
chaque fois que je voulais ouvrir un fichier. Cela fonctionne pour mon utilisation particulière, mais je ne sais pas si cela sys.path[0]
pourrait échouer dans un autre cas d'utilisation.
Ma question est donc la suivante: quel est le moyen le meilleur et le plus fiable d'ouvrir un fichier qui se trouve dans le même répertoire que le script Python en cours d'exécution?
Voici ce que j'ai pu comprendre jusqu'à présent:
os.getcwd()
etos.path.abspath('')
renvoie le "répertoire de travail actuel", pas le répertoire de script.os.path.dirname(sys.argv[0])
etos.path.dirname(__file__)
renvoyer le chemin utilisé pour appeler le script, qui peut être relatif ou même vide (si le script est dans le cwd). De plus,__file__
n'existe pas lorsque le script est exécuté en IDLE ou PythonWin.sys.path[0]
etos.path.abspath(os.path.dirname(sys.argv[0]))
semblent renvoyer le répertoire de script. Je ne sais pas s'il y a une différence entre ces deux.
Éditer:
Je viens de réaliser que ce que je veux faire serait mieux décrit comme "ouvrir un fichier dans le même répertoire que le module contenant". En d'autres termes, si j'importe un module que j'ai écrit dans un autre répertoire, et que ce module ouvre un fichier, je veux qu'il recherche le fichier dans le répertoire du module. Je ne pense pas que ce que j'ai trouvé soit capable de faire ça ...
__file__
ne peut pas être utilisé, utilisez à lasys.argv[0]
place dedirname(__file__)
. Le reste devrait fonctionner comme prévu. J'aime utiliser__file__
parce que dans le code de la bibliothèque, il sesys.argv[0]
peut que le code ne pointe pas du tout vers votre code, surtout s'il est importé via un script tiers.