Estoy tratando de determinar el módulo actual real de una función (como se ve si se importó desde otro lugar), incluso si el módulo actual es el "top level scripting environment" __main__
.Python: determine el módulo actual actual (no __main__)
Puede parecer una cosa rara, pero el trasfondo es que necesito serializar una función y deserializarla (incluidos los argumentos) en una máquina diferente, para lo cual necesito asegurarme de que el módulo correcto Y NO __main__
se importa antes de deserializar (de lo contrario, aparece un error que dice AttributeError: 'module' object has no attribute my_fun
).
Hasta ahora, he tratado inspection:
import inspect
print inspect.getmodule(my_fun)
que me da
<module '__main__' from 'example.py'>
por supuesto. También traté de encontrar algo útil usando globals()
, sin suerte.
Lo que realmente quiero es <module 'example' from 'example.py'>
. Supongo que una manera hacky sería analizarlo desde el nombre de archivo usando algo como
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
y luego encontrar el módulo por su nombre sys.modules[m_name]
.
¿Existe alguna manera más limpia/mejor para hacer esto?
EDIT: Después de aprender sobre "FakeModule" de ipython y un poco más buscando en Google, me encontré con this post, que describe exactamente el problema que estoy enfrentando, incluyendo mi solución actual a la misma (que está importando explícitamente el módulo actual import current_module
y serializando current_module.my_fun
en lugar de my_fun). Estoy tratando de evitar esto, ya que puede no ser intuitivo para los usuarios de mi paquete.
¿Ha mirado antes las partes internas de la biblioteca 'nose', específicamente el módulo' importador'? 'nose' hace algunas cosas muy similares a esto, por lo que podría ser un buen lugar para buscar inspiración. –