Obtener ruta de importación de función

from pack.mod import f 

Cómo obtener información del objeto f sobre la importación – 'pack.mod'

Puedo obtenerlo usando f.__module__ pero si la función def en el módulo donde obtengo este atributo ( f.__module__ ) devuelve '__main__' . Pero necesito una ruta real aquí – 'pack.mod'

Encontré esta manera de obtener esta información:

 inspect.getmodule(f).__file__ 

entonces puedo sub iniciar ruta desde sys.path , reemplazar / en . y obtén una ruta como – 'pack.mod' Pero puede existir de una manera más conveniente?

Lo que inspect.getmodule(f) hace internamente, según las fonts de inspect.py , es esencialmente sys.modules.get(object.__module__) . No llamaría a ese código directamente “más conveniente”, aunque (más allá de “esencialmente “parte, inspect tiene un montón de captura útil y corrección de casos de esquina).

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

Edit : leyendo entre líneas parece que el OP está tratando de hacer algo como

 python /foo/bar/baz/bla.py 

y dentro de bla.py (que, por lo tanto, se ejecuta como __main__ ) determina “¿ from qué o from qué statement podría utilizar un script principal diferente para importar esta función desde dentro de mí?”.

El problema es que la pregunta está mal planteada, ya que tal vez no haya una ruta de este tipo que se pueda utilizar para este propósito (nada garantiza que la ruta de la secuencia de comandos principal actual esté en sys.path cuando esa secuencia de comandos principal diferente se ejecute más adelante), puede haber varias Las unidades (por ejemplo, /foo/bar y /foo/bar/baz pueden estar en sys.path y /foo/bar/baz/__init__.py , en cuyo caso, from baz.bla import f y from bla import f pueden trabajo), y nada garantiza que algún otro elemento de sys.path anterior no pueda “anticiparse” al bash de importación (por ejemplo, decir /foo/bar/baz está en sys.path , pero antes también está /fee/fie/foo , y también existe un archivo /fee/fie/foo/bla.py completamente no relacionado (etc, etc).

Cualquiera que sea el propósito de este tipo de bash de descubrimiento, sugiero encontrar una architecture alternativa, por ejemplo, una donde from baz.bla import f se ejecute realmente (como dice el OP al comienzo de la pregunta), por lo que f.__module__ es correctamente configurado en baz.bla .

Quieres el atributo __name__ de __module__ :

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