Re: Importar módulo que se encuentra en directorio padre

Chema Cortes pych3m4 en gmail.com
Jue Abr 26 19:51:12 CEST 2007


El 26/04/07, Javier Pérez Pacheco <javielinux en gmail.com> escribió:
> Bueno. La cosa es q tengo un archivo python donde tengo varias funciones que
> uso en varios script. Para importar el archivo "modulo.py" lo dejo en el
> mismo directorio del archivo donde quiero usarlo y escribo
>
> import modulo
>
> y ya está. Pero si tuviera el archivo en el directorio padre ¿como cargo el
> modulo en archivo donde quiero usarlo?
>
> La estructura sería así
>
> .
> ..
> modulo.py
> DIRECTORIO/archivo.py
>
> Quiero cargar el modulo.py en mi script llamado "archivo.py". Espero haberme
> explicado bien

Todo script de python tiene que ser capaz de localizar el módulo que
necesita, esté en site-packages o en un directorio arbitrario. Puedes
alterar la ruta de búsqueda (sys.path) por asegurar la carga de una
versión del módulo cuando existen varios módulos con el mismo nombre;
pero no es práctico que tus scripts anden cambiando esta ruta, y mucho
menos usar rutas relativas (¿relativas a qué?).

Normalmente, lo que necesitas es construir un "paquete" con todas tus
funciones y dejarlo en algún lugar accesible (sigue la documentación
sobre cómo construir paquetes y cómo tenerlos accesibles).

Si aún con lo dicho no te soluciona nada, te daré algunos consejos
para usar "rutas relativas":

No es lo mismo si ejecutar un módulo directamente que importarlo desde
otro módulo. Un módulo ejecutado directamente (__name__=="__main__")
SIEMPRE requiere rutas absolutas (incluso en python 2.5 con el nuevo
from .. import). A veces necesitas saber en qué directorio está un
módulo para leer un fichero de configuración o, como en tu caso,
acceder a un módulo en el directorio superior. No te vale usar
os.getcwd() porque tu módulo puede ser ejecutado desde cualquier
sitio, fuera del directorio donde se encuentre

Solución: teniendo en cuenta que en sys.argv[0] el sistema te pasa el
nombre del script con ruta absoluta:

import os, sys

def _rel2abspath(fname):
    appdir=os.path.abspath(os.path.dirname(sys.argv[0]))
    return os.path.join(appdir,fname)

sys.path.insert(0,_rel2abspath(".."))
import mimodulo


Si va a ser algo muy puntual, puedes usar el módulo 'imp' para
importar el módulo desde una ruta arbitraria.


Conclusión: estudia cómo hacer paquetes y cómo añadirlos a la ruta de
búsqueda con la variable de entorno PYTHONPATH y los ficheros .pth




Más información sobre la lista de distribución Python-es