2010-03-10 19 views
10
from pack.mod import f 

Como llegar desde el objeto f información sobre la importación - 'pack.mod'obtener la ruta de función de importación

puedo conseguirlo utilizando f.__module__ pero si la función DEF en el módulo donde consigo este atributo (f.__module__) devuélvalo '__main__'. Pero necesito camino real aquí - 'pack.mod'

encontré esta forma de obtener esta información:

inspect.getmodule(f).__file__ 

entonces puedo sub iniciar camino desde sys.path, reemplace / en . y obtener camino como - 'pack.mod' pero puede existir de alguna manera más conveniente?

+2

¿por qué necesita esto para empezar? – SilentGhost

Respuesta

12

Lo inspect.getmodule(f) hace internamente, por inspect.py's sources, es esencialmente sys.modules.get(object.__module__) - Yo no llamaría a usar ese código directamente "más conveniente", aunque (más allá de la parte "esencialmente", inspect tiene mucha utilidad captura y corrección de casos de esquina).

¿Por qué no llamar directamente al inspect.getsourcefile(f)?

Editar: leer entre líneas parece que el PO está tratando de hacer algo como

python /foo/bar/baz/bla.py 

y dentro bla.py (que por lo tanto se está ejecutando como __main__) determinar "lo from o import declaración podría una diferentes secuencias de comandos principales para importar esta función desde mi interior? ".

El problema es que la pregunta está mal planteada, ya que puede que no haya cualquier tales ruta utilizable para el propósito (nada garantiza ruta de la corriente de secuencia de comandos principal está en sys.path cuando tan diferente script principal se ejecute más adelante), hay podría ser varios diferentes (por ejemplo, ambos /foo/bar y /foo/bar/baz podría estar en sys.path y /foo/bar/baz/__init__.py existen, en cuyo caso from baz.bla import f y from bla import f podría tanto el trabajo), y nada garantiza que algunos otra, sys.path elemento anterior podría no "adelantarse" el intento de importación (por ejemplo, digamos /foo/bar/baz está en sys.path, pero antes de También hay /fee/fie/foo y también existe un archivo /fee/fie/foo/bla.py completamente no relacionado, etc., etc.

Sea cual sea el propósito de este tipo de intento de descubrimiento, sugiero la búsqueda de una arquitectura alternativa - por ejemplo, una donde from baz.bla import fes realmente ejecutada (como dice el OP en el inicio de la pregunta), de manera que f.__module__ es correcta establecido en baz.bla.

+0

OK, pero necesito una forma nativa de obtener información en formato listo para importar, no una ruta de archivo que deba analizar para extraer información. ¿Existe o debo analizar el camino de todos modos? – evg

+1

El atributo '__module__' le da esa ruta, usted dice que da' __main__', pero eso nunca ocurrirá cuando haya terminado, como usted también dice, 'from path.mod import f' - solo si usted ' volver a ejecutar el archivo como el script principal en lugar de importarlo, y esa declaración 'from' significa que ** está ** importando y así' '__module__' funciona bien. –

+0

Mi objetivo es escribir logger. lo cuelgo en la función como decorador. Vacia todos los argumentos de función con los que llamó en db, también se escribe el nombre de la función y el nombre del módulo; necesito esta información para restaurar la llamada de función más tarde con este argumento a petición. Para restaurar la llamada, necesito la función de carga antes, y esa es la razón por la que necesito una ruta para cargarla ... Me estoy dirigiendo a ese sys.path siempre igual. Mb, necesito otra forma de identificar cómo cargar la función, la ruta de archivo completo m.b y el nombre de función mejor ... pero en este caso necesito analizar la ruta del archivo y sys.path para compilar una ruta de importación válida ... ¿es correcto? – evg

2

desea que el atributo de __name____module__:

In [16]: import inspect 
In [17]: inspect.getmodule(MyObject).__name__ 
Out[17]: 'lib.objects.MyObject' 
Cuestiones relacionadas