443 votes

Comment puis-je obtenir le chemin du script Python que je suis en train d'exécuter ?

Duplicata :
En Python, comment puis-je obtenir le chemin et le nom du fichier en cours d'exécution ?

Comment puis-je obtenir le chemin du script que je suis en train d'exécuter ? Je faisais dirname(sys.argv[0]) Cependant, sur Mac, je n'obtiens que le nom du fichier, et non le chemin d'accès complet comme sous Windows.

Quel que soit l'endroit d'où mon application est lancée, je veux ouvrir les fichiers qui sont relatifs à mon ou mes fichiers script.

23 votes

Il semble que Jeff ait oublié que tous les scripts python ne sont pas des modules, veuillez proposer la réouverture.

0 votes

@sorin oh, mais ils le sont ; a module peut être créé pour tout fichier script. Ce n'est pas parce que quelque chose n'est jamais réellement import ed n'en fait pas "un module". La réponse est la même, de toute façon : traiter le script comme un module (utiliser une sorte de bootstrap si c'est vraiment nécessaire) et ensuite appliquer la même technique.

8 votes

Oui, un script est un module, mais cette question bien posée devrait être rouverte. Elle n'a pas reçu de réponse ici, et la question "dupliquée" n'en est pas une car elle répond seulement à la façon d'obtenir l'emplacement d'un module que vous avez chargé, pas celui dans lequel vous vous trouvez.

573voto

jblocksom Points 4504

Utilisez ceci pour obtenir le chemin d'accès du fichier actuel. Elle résoudra tous les liens symboliques dans le chemin.

import os

file_path = os.path.realpath(__file__)

Cela fonctionne bien sur mon mac.

23 votes

Je n'en suis pas si sûr, voici un résultat pour OSX 10.6 NameError: global name '__file__' is not defined

20 votes

Sorin : Peut-être avez-vous essayé l'expression dans la coquille ?

4 votes

J'obtiens la même chose en l'utilisant dans un programme et non dans le shell. Fichier " C:\Python27\pydocs\cli_mate nouveau \chimpbot.py ", ligne 15, dans init self.current_dict = os.path.realpath( fichier )+' \data\default_dict.dat ' NameError : nom global ' fichier n'est pas défini

142voto

jcoon Points 5693
import os
print os.path.abspath(__file__)

7 votes

Merci. Cela donne le chemin du fichier .py où le code est écrit, ce qui est ce que je veux, même si l'OP voulait un autre chemin.

18 votes

Ces informations doivent être combinées avec celles de l'autre réponse : os.path.abspath(os.path.dirname(__file__)) donnera le répertoire.

134voto

Jon W Points 7032

7.2 de Dive Into Python : Trouver le chemin .

import sys, os

print('sys.argv[0] =', sys.argv[0])             
pathname = os.path.dirname(sys.argv[0])        
print('path =', pathname)
print('full path =', os.path.abspath(pathname))

2 votes

J'aime la façon dont votre réponse montre beaucoup de variations et de fonctionnalités différentes de python pour résoudre la question.

0 votes

Oui, et je l'aime mieux parce qu'il n'utilise pas __ variables (je sais que c'est juste une convention pour les noms de système)

144 votes

Este ne fonctionne pas si vous appelez le script via un autre script d'un autre répertoire.

46voto

Dan Points 189

La solution acceptée pour cela ne fonctionnera pas si vous envisagez de compiler vos scripts à l'aide de py2exe. Si vous envisagez de le faire, voici l'équivalent fonctionnel :

os.path.dirname(sys.argv[0])

Py2exe ne fournit pas de __file__ variable. Pour référence : http://www.py2exe.org/index.cgi/Py2exeEnvironment

3 votes

Malheureusement, cela ne fonctionne pas sur Mac, comme le dit l'OP. Veuillez consulter sys.argv : le fait qu'il s'agisse d'un nom de chemin complet ou non dépend du système d'exploitation.

1 votes

(il est incroyablement complexe d'obtenir une solution réellement multi-navigateurs...)

8 votes

@Stefano ce n'est pas un problème . Pour être sûr qu'il s'agit d'un nom de chemin absolu (complet), utilisez os.path.abspath(...)

-7voto

Chris Lutz Points 34157

Si vous avez même le nom de chemin relatif (dans ce cas, il semble être ./ ) vous pouvez ouvrir des fichiers relatifs à votre/vos fichier(s) script. J'utilise Perl, mais la même solution générale peut s'appliquer : Je divise le répertoire en un tableau de dossiers, puis pop le dernier élément (le script), puis push (ou pour vous, append ) sur ce que je veux, puis les réunir à nouveau, et BAM ! j'ai un nom de chemin fonctionnel qui pointe exactement vers l'endroit où je l'attends, relatif ou absolu.

Bien sûr, il existe de meilleures solutions, comme indiqué. J'aime juste un peu la mienne.

6 votes

Dans python, cela ne fonctionne pas si vous appelez le script à partir d'un chemin complètement différent, par exemple si vous êtes dans ~ et ton script est dans /some-path/script vous obtiendrez ./ égal à ~ et non /some-path comme il l'a demandé (et j'en ai besoin aussi)

3 votes

La question était de savoir comment obtenir le chemin du module, et non comment construire un chemin à partir d'un autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X