Python: определить фактический текущий модуль (не __main__)

Я пытаюсь определить фактический текущий модуль функции (как видно, если он импортирован из другого места), даже если текущий модуль является " средой сценариев верхнего уровня. ] " __main__.

Это может показаться странным, но суть в том, что мне нужно сериализовать функцию и десериализовать ее (включая аргументы) на другой машине, для которой мне нужно убедиться, что модуль правильный, А НЕ __main__импортируется перед десериализацией (в противном случае я получаю сообщение об ошибке AttributeError: объект 'module' не имеет атрибута my_fun).

До сих пор я пробовал инспекцию:

import inspect
print inspect.getmodule(my_fun)

, что дает мне


, конечно. Я также пытался найти что-то полезное, используя globals(), но безуспешно.

Что мне действительно нужно, так это . Я полагаю, что хакерским способом было бы проанализировать его по имени файла, используя что-то вроде

m_name = __main__.__file__.split("/")[-1].replace(".pyc","")

, а затем найти модуль по имени sys.modules[m_name].

Есть ли более чистый/лучший способ сделать это?

РЕДАКТИРОВАТЬ: Узнав о «FakeModule» ipython и немного погуглив, я наткнулся на этот пост, в котором точно описывается проблема, с которой я столкнулся, включая мое текущее решение (которое явно импортирует текущий модуль импортировать current_moduleи сериализовать current_module.my_funвместо my_fun). Я пытаюсь этого избежать, так как это может быть не интуитивно понятным для пользователей моего пакета.

12
задан Community 23 May 2017 в 12:26
поделиться