2010-11-15 14 views
21

Tengo un módulo de Python que utiliza algunos recursos en un subdirectorio del directorio del módulo. Después de buscar en todo el desbordamiento de pila y la búsqueda de respuestas relacionadas, logré dirigir el módulo a los recursos mediante el uso de algo así como¿Cómo uso una ruta relativa en un módulo de Python cuando la CWD ha cambiado?

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

Esto funciona bien cuando llamo el módulo de otros lugares, pero se degrada cuando llamo el módulo después de cambiar el directorio de trabajo actual. El problema es que el contenido de __file__ son una ruta relativa, que no toma en cuenta el hecho de que he cambiado el directorio:

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

Cómo puedo codificar la ruta absoluta en __file__, o la prohibición de que, cómo ¿puedo acceder a mis recursos en el módulo sin importar el directorio de trabajo actual? ¡Gracias!

Respuesta

39

almacenar la ruta absoluta al directorio de módulos en el comienzo del módulo:

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

A continuación, cargar sus recursos basados ​​en esta package_directory:

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

Y después de todo, no lo hacen modificar los recursos de todo el proceso como el directorio de trabajo actual. Nunca hay una necesidad real de cambiar el directorio de trabajo en un programa bien escrito, por lo tanto, evite os.chdir().

+0

Gracias, eso funciona a la perfección! También tendré presente su observación para evitar cambiar el directorio de trabajo. – jvkersch

Cuestiones relacionadas