2009-08-18 8 views
28

Comment puis-je trouver le chemin d'accès complet au script Python en cours d'exécution? C'est-à-dire, qu'est-ce que je dois mettre pour y parvenir:Rechercher le chemin d'accès au fichier en cours d'exécution

[email protected]:/tmp$ python baz.py 
running from /tmp 
file is baz.py 
+0

duplication possible de [Comment obtenir le chemin complet du répertoire du fichier actuel en Python?] (Http://stackoverflow.com/questions/3430372/how-to-get-full-path-of-current-files-directory -in-python) Cela est arrivé plus tôt, mais c'est plus explicite. Ou: http://stackoverflow.com/questions/50499/in-python-how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executin –

Répondre

50

__file__ est pas ce que vous recherchez. Ne pas utiliser accidentellement des effets secondaires

sys.argv[0] est-toujours le chemin du script (si, en fait, a été invoqué un script) - voir http://docs.python.org/library/sys.html#sys.argv

__file__ est le chemin de l'en cours d'exécution fichier (script ou module). C'est accidentellement le même que le script si on accède à partir du script! Si vous voulez mettre des choses utiles comme localiser des fichiers de ressources relatifs à l'emplacement du script dans une bibliothèque, vous devez utiliser sys.argv[0].

Exemple:

C:\junk\so>type \junk\so\scriptpath\script1.py 
import sys, os 
print "script: sys.argv[0] is", repr(sys.argv[0]) 
print "script: __file__ is", repr(__file__) 
print "script: cwd is", repr(os.getcwd()) 
import whereutils 
whereutils.show_where() 

C:\junk\so>type \python26\lib\site-packages\whereutils.py 
import sys, os 
def show_where(): 
    print "show_where: sys.argv[0] is", repr(sys.argv[0]) 
    print "show_where: __file__ is", repr(__file__) 
    print "show_where: cwd is", repr(os.getcwd()) 

C:\junk\so>\python26\python scriptpath\script1.py 
script: sys.argv[0] is 'scriptpath\\script1.py' 
script: __file__ is 'scriptpath\\script1.py' 
script: cwd is 'C:\\junk\\so' 
show_where: sys.argv[0] is 'scriptpath\\script1.py' 
show_where: __file__ is 'C:\\python26\\lib\\site-packages\\whereutils.pyc' 
show_where: cwd is 'C:\\junk\\so' 
+0

D'accord! Désolé, il a fallu un moment pour que je m'y rende; J'avais pris un peu de recul par rapport au code utilisé pour cela. Mais après beaucoup de délibérations, os.getcwd() a fait exactement ce dont j'avais besoin et pas __file__, qui m'a donné le nom du fichier dans lequel cette fonction était (pas le fichier en cours d'exécution). –

+2

En note, si vous recherchez le chemin d'accès au fichier qui contient la ligne de code spécifique en cours d'exécution, '__file__' est celui à utiliser. (Comme, un '__init __. Py' où vous ne savez pas où il va vivre et devez ajouter' dirname() 'à' sys.path' quand ce module est importé ...) –

+1

@MarkRibau: Votre première phrase est vraie mais superflue (c'est ce que '__file__' est défini comme étant). Votre 2ème phrase n'a rien à voir avec la question, et est extrêmement déroutante: si vous ne savez pas où se trouve un module, vous ne pouvez pas l'importer, et si vous ne pouvez pas l'importer, vous ne pouvez pas obtenir son '__file__' ... –

16

Cela affichera le répertoire dans lequel vit le script (par opposition au répertoire de travail):

import os 
dirname, filename = os.path.split(os.path.abspath(__file__)) 
print "running from", dirname 
print "file is", filename 

Voici comment il se comporte, quand je le mets dans c:\src:

> cd c:\src 
> python so-where.py 
running from C:\src 
file is so-where.py 

> cd c:\ 
> python src\so-where.py 
running from C:\src 
file is so-where.py 
+0

Notez que cela échoue lors de l'exécution de py2exe, si jamais vous envisagez d'utiliser cela. Dans ce cas, vous pouvez importer un module fictif à côté du module principal et obtenir son attribut __file__ et suivre le même processus, bien que le module soit contenu dans un.fichier zip, vous devrez donc le diviser un peu différemment. – FogleBird

+1

@FogleBird: Qu'est-ce qui ne va pas en évitant complètement '__file__' et en suivant ceci: http://www.py2exe.org/index.cgi/WhereAmI ?? –

+0

Eh bien, mon chemin fonctionne à la fois dans py2exe et à l'extérieur sans aucun contrôle conditionnel. En outre, les docs py2exe sont très dispersés et difficiles à trouver ce que vous cherchez. – FogleBird

2
import sys, os 

file = sys.argv[0] 
pathname = os.path.dirname(file) 
print 'running from %s' % os.path.abspath(pathname) 
print 'file is %s' % file 

Vérifiez os.getcwd() (docs)

2

Le nom du script (? Toujours) le premier indice de sys.argv:

import sys 
print sys.argv[0] 

Une encore plus facile de trouver le chemin de votre script en cours d'exécution:

os.path.basename(sys.argv[0]) 
+0

Mais vous pourriez exécuter le script depuis un autre répertoire, et argv [0] retournerait le script chemin, pas le vôtre. – ramosg

+1

@willehr: Le chemin du script est EXACTEMENT celui requis par le PO. –

+1

@Daz: (1) erreur de syntaxe (2) si le chemin absolu vers le script est par exemple 'r 'C: \ myfiles \ fubar.py" ', le nom de base est' "fubar.py" '- est-ce que vous appelez "le chemin de votre script en cours"? –

1

Le fonctionnement le fichier est toujours __file__.

est ici un script de démonstration, nommé identify.py

print __file__ 

Voici les résultats

MacBook-5:Projects slott$ python StackOverflow/identify.py 
StackOverflow/identify.py 
MacBook-5:Projects slott$ cd StackOverflow/ 
MacBook-5:StackOverflow slott$ python identify.py 
identify.py 
2

Je suggère

import os, sys 
print os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0] 

De cette façon, vous pouvez en toute sécurité créer des liens symboliques vers le script exécutable et il trouvera toujours le bon répertoire.

Questions connexes