2010-11-15 6 views
21

J'ai un module Python qui utilise certaines ressources dans un sous-répertoire du répertoire du module. Après la recherche autour de débordement de pile et de trouver des réponses connexes, j'ai réussi à diriger le module des ressources en utilisant quelque chose commeComment utiliser un chemin relatif dans un module Python lorsque le CWD a changé?

import os 
os.path.join(os.path.dirname(__file__), 'fonts/myfont.ttf') 

Cela fonctionne bien quand je l'appelle le module d'ailleurs, mais il me brise quand je l'appelle le module après avoir changé le répertoire de travail actuel. Le problème est que le contenu de __file__ sont un chemin relatif, qui ne tient pas compte du fait que je l'ai changé le répertoire:

>>> mymodule.__file__ 
'mymodule/__init__.pyc' 
>>> os.chdir('..') 
>>> mymodule.__file__ 
'mymodule/__init__.pyc' 

Comment puis-je encoder le chemin absolu dans __file__, ou à défaut, comment puis-je accéder à mes ressources dans le module, quel que soit le répertoire de travail actuel? Merci!

Répondre

39

Mémorisez le chemin absolu du répertoire du module au début du module:

package_directory = os.path.dirname(os.path.abspath(__file__)) 

Ensuite, chargez vos ressources en fonction de ce package_directory:

font_file = os.path.join(package_directory, 'fonts', 'myfont.ttf') 

Et après tout, ne pas modifier des ressources à l'échelle du processus comme le répertoire de travail actuel. Il n'y a jamais un réel besoin de changer le répertoire de travail dans un programme bien écrit, par conséquent éviter os.chdir().

+0

Merci, cela fonctionne parfaitement! Je garderai également votre remarque en tête pour éviter de changer le répertoire de travail. – jvkersch

Questions connexes