2011-08-22 15 views
36

Suponiendo que tengo dos módulos de Python y PATH_B está en la ruta de importación:¿De dónde se importa el módulo?

# file: path_b/my_module.py 
print "I was imported from ???" 

#file: path_a/app.py 
import my_module 

¿Es posible ver que el módulo ha sido importada desde? Quiero un resultado como "Me importaron de path_a/app.py", si comienzo app.py (porque necesito el nombre del archivo).

Editar: Para una mejor comprensión; Podría escribir:

# file: path_b/my_module.py 
def foo(file): 
    print "I was imported from %s" % file 

#file: path_a/app.py 
import my_module 
my_module.foo(__file__) 

lo que la salida sería:

$> python path_app.py 
I was imported from path_a/app.py 

Respuesta

12

Puede haber una manera más fácil de hacer esto, pero esto funciona:

import inspect 

print inspect.getframeinfo(inspect.getouterframes(inspect.currentframe())[1][0])[0] 

Recuerde que la ruta será impreso relativo al directorio de trabajo actual si es un directorio principal de la ubicación del script.

+1

Eso es lo que busqué. Gracias. – svenwltr

6

Trate my_module.__file__ para averiguar de dónde proviene. Si obtienes un AttributeError, probablemente no sea un archivo fuente Python (.py).

34

Prueba esto:

>>> import my_module 
>>> my_module.__file__ 
'/Users/myUser/.virtualenvs/foobar/lib/python2.7/site-packages/my_module/__init__.pyc' 

Edición

En ese caso, la escritura en el archivo __init__.py de su módulo:

print("%s: I was imported from %s" %(__name__, __file__)) 
+3

Después de la llamada 'app.py' Quiero la ruta desde 'app.py' dentro del módulo 'my_module'. – svenwltr

+1

Esto no funciona para 'de la cosa de importación de módulo'; entonces 'cosa .__ archivo__' no estará presente. – tripleee

-3

Otras respuestas están bien, pero si quieres Dígalo desde dentro de el módulo importado luego haga

print "I was imported from %s" % __file__ 
1

Además, si usted tiene una función/clase f de un módulo m se puede obtener la ruta del módulo usando el módulo inspect

import inspect 
from m import f 

print inspect.getmodule(f) 
0

He escrito un script simple así que tengo el comando pywhich que me permite encontrar de dónde viene un módulo de Python. No funciona para algunos builtins como sys que no tiene un atributo \__file__.

Esto se puede ejecutar desde una línea de comandos de Linux para encontrar donde un script en Python ejecutar en el entorno actual obtendrá un módulo de, por ejemplo:

% pywhich os


#! /usr/bin/env python 

def pywhich(module_name): 

    module = __import__(module_name, globals(), locals(), [], -1) 

    return module.__file__ 


if __name__ == "__main__": 

    import sys 

    print(pywhich(sys.argv[1])) 
Cuestiones relacionadas