2011-07-28 1 views
4
import os 
print __file__ 
print os.path.dirname(__file__) 
os.chdir('/tmp') 
print __file__ # unchanged, of course 
print os.path.dirname(__file__) # now broken 

J'ai cette question ci-dessus où dirname(__file__) ne peut plus compter sur une après os.chdir a été utilisé dans le script, après chargement du module a mis __file__.__file__ et le module os.path ne jouent pas bien?

Quel est le mécanisme habituel pour contourner ce problème, en supposant que vous ne sachiez pas où/quand/comment os.chdir a pu avoir été appelé précédemment?

modifier: J'espère que ce deuxième exemple peut mieux clarifier ma question

import os 
old_dir = os.getcwd() 
print os.path.abspath(__file__) 
os.chdir('/tmp') 
print os.path.abspath(__file__) 
os.chdir(old_dir) 

la sortie est comme ceci:

[email protected]:~$ python --version 
Python 2.7.1+ 
[email protected]:~$ pwd 
/home/wim 
[email protected]:~$ python /home/wim/spam.py 
/home/wim/spam.py 
/home/wim/spam.py 
[email protected]:~$ python ./spam.py 
/home/wim/spam.py 
/tmp/spam.py 
+0

Impossible de reproduire sous Windows 7, Python 2.6.2. Est-ce que le répertoire est passé à matter, ou est-ce que n'importe quel répertoire le fait? Le fichier doit-il être importé ou peut-il être exécuté de manière autonome? Quelle version de Python utilisez-vous? Comment exactement est-il "cassé" la deuxième fois (ce qui n'est pas attendu)? – Cameron

+0

"Quel est le mécanisme habituel pour contourner ce problème"? Quelle? Pourquoi faites-vous ce que le chemin absolu de '__file__'? Pourquoi attendez-vous jusqu'à ce que vous ne "sachiez pas où/quand/comment os.chdir a été appelé précédemment" pour obtenir le chemin absolu? –

+0

Désolé, la raison est pour une utilisation dans une fonction d'aide au débogage. J'utilise inspect module pour obtenir un tas d'autres informations, de sorte qu'au lieu de jeter du code avec "print i" par exemple, je puisse utiliser 'dbgp ('i')' et obtenir une ligne de sortie de couleur différente comme ' /abs/path/to_file.py:line_number i = repr (i) ' – wim

Répondre

1

Le __file__ doit exister dans sys.path quelque part.

for dirname in sys.path: 
    if os.path.exists(os.path.join(dirname,__file__)): 
     # The directory name for `__file__` was dirname 
+0

ne peut pas le même nom de fichier '__file__' existe dans' sys.path' plusieurs fois? – wim

+0

@wim: Oui. Ça pourrait. Alors? Python recherche sys.path dans l'ordre où il se charge. Vous recherchez dans le même ordre. –

+0

c'est surtout correct. cependant, il y a un cas spécial où '__file__' était un chemin absolu, et' os.path.exists (dirname, __ file __) 'renvoie True car' dirname', de 'sys.path [0]', était ''' '(la chaîne vide). – wim

1

Le dernier exemple présente un élément de chemin relatif au nom __file__ (./xxx.py). Lorsque abspath est appelée, elle est étendue au répertoire en cours.

Si vous mettez ce code dans un module, vous n'aurez pas ce problème.

Questions connexes