【发布时间】:2012-05-31 13:07:41
【问题描述】:
我正在尝试确定函数的实际当前模块(如从其他地方导入的那样),即使当前模块是“top level scripting environment”__main__。
这听起来可能很奇怪,但背景是我需要在另一台机器上序列化一个函数并反序列化它(包括参数),为此我需要确保正确的模块而不是@987654325 @ 在反序列化之前导入(否则我会收到错误消息 AttributeError: 'module' object has no attribute my_fun)。
到目前为止,我已经尝试过inspection:
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”和更多的谷歌搜索之后,我遇到了this post,它准确地描述了我面临的问题,包括我当前的解决方案(显式导入当前模块 import current_module 并序列化current_module.my_fun 而不是 my_fun)。我试图避免这种情况,因为它对我的包的用户来说可能不直观。
【问题讨论】:
-
你以前看过
nose库的内部结构,特别是importer模块吗?nose做了一些与此非常相似的事情,所以它可能是寻找灵感的好地方。
标签: python python-module inspection