650 votos

Recuperar la ruta del módulo python

Quiero detectar si ha cambiado el módulo. Ahora, usando inotify es sencillo, sólo necesitas conocer el directorio de que desea obtener notificaciones.

¿Cómo puedo recuperar la senda de un módulo en python.

760voto

orestis Puntos 3398
import a_module
print a_module.__file__

En realidad le dará la ruta al archivo .pyc que estaba cargado, al menos en Mac OS X. Así que supongo que puedes hacer

import os
path = os.path.dirname(amodule.__file__)

Para obtener el directorio para buscar cambios.

228voto

SummerBreeze Puntos 656

Hay inspect módulo en python.

Documentación oficial

El inspeccione el módulo proporciona varias funciones útiles para ayudar a conseguir la información acerca de los objetos vivos tales como módulos, clases, métodos, las funciones, las trazas de retorno, marco objetos, y los objetos de código. Por ejemplo, puede ayudar a examinar el contenido de una clase, recuperar la fuente el código de un método, el extracto y el formato de la lista de argumentos de una función, o obtener toda la información que usted necesita para mostrar una detallada sobre la procedencia del producto.

Ejemplo:

>>> import os
>>> import inspect
>>> inspect.getfile(os)
'/usr/lib64/python2.7/os.pyc'
>>> inspect.getfile(inspect)
'/usr/lib64/python2.7/inspect.pyc'
>>> os.path.dirname(inspect.getfile(inspect))
'/usr/lib64/python2.7'

64voto

mcstrother Puntos 732

Como las otras respuestas han dicho, la mejor manera de hacer esto es con __file__ (demostrado de nuevo por debajo). Sin embargo, hay una advertencia importante, que es que __file__ NO existe si está ejecutando el módulo en su propio (es decir. como __main__).

Por ejemplo, supongamos que tiene dos archivos (ambos de los cuales son en su PYTHONPATH):

#/path1/foo.py
import bar
print bar.__file__

y

#/path2/bar.py
import os
print os.getcwd()
print __file__

Ejecución foo.py se dará la salida:

/path1        # "import bar" causes the line "print os.getcwd()" to run
/path2/bar.py # then "print __file__" runs
/path2/bar.py # then the import statement finishes and "print bar.__file__" runs

Sin EMBARGO, si intenta ejecutar bar.py en su cuenta, usted podrá obtener:

/path2                              # "print os.getcwd()" still works fine
Traceback (most recent call last):  # but __file__ doesn't exist if bar.py is running as main
  File "/path2/bar.py", line 3, in <module>
    print __file__
NameError: name '__file__' is not defined 

Espero que esto ayude. Esta advertencia me costó un montón de tiempo y confusión, mientras que las pruebas de las otras soluciones que se presentan.

19voto

Cheery Puntos 6696

Esto era trivial.

Cada módulo tiene un __file__ variable que muestra su ruta de acceso relativa desde donde estás ahora.

Por lo tanto, conseguir un directorio para el módulo a notificar es simple como:

os.path.dirname(__file__)

17voto

vinoth Puntos 119
import os
path = os.path.abspath(__file__)
dir_path = os.path.dirname(path)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X