我正在尝试确定函数的实际当前模块(在其他地方导入时可见),即使当前模块是“顶级脚本环境”__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
而不是my_fun)。我试图避免这种情况,因为这对我的软件包用户可能不直观。
nose
库的内部结构吗?特别是其中的importer
模块?nose
做了一些与此非常相似的事情,因此它可能是寻找灵感的好地方。 - Silas Ray