我正在尝试确定函数的实际当前模块(如从其他地方导入的那样),即使当前模块是“顶级脚本环境” __main__
。
这听起来像是一件奇怪的事情,但背景是我需要序列化一个函数并在另一台机器上反序列化它(包括参数),为此我需要确保__main__
在反序列化之前导入正确的模块而不是(否则我会收到错误消息AttributeError: 'module' object has no attribute my_fun
)。
到目前为止,我已经尝试过检查:
import inspect
print inspect.getmodule(my_fun)
这给了我
<module '__main__' from 'example.py'>
当然。我还尝试使用 找到有用的东西globals()
,但没有运气。
我真正想要的是<module 'example' from 'example.py'>
。我想一个hacky方法是使用类似的东西从文件名中解析它
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
然后按名称找到模块sys.modules[m_name]
。
有没有更清洁/更好的方法来做到这一点?
编辑:在了解了 ipython 的“FakeModule”和更多的谷歌搜索之后,我看到了这篇文章,它准确地描述了我面临的问题,包括我当前的解决方案(显式导入当前模块import current_module
并序列化current_module.my_fun
而不是我的乐趣)。我试图避免这种情况,因为它对我的包的用户来说可能不直观。