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
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
"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? –
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