我正在尝试确定函数的实际当前模块(如从其他地方导入时所见),即使当前模块是“top level scripting environment”__main__
。
这听起来像是一件奇怪的事情,但背景是我需要序列化一个函数并在另一台机器上反序列化它(包括参数),为此我需要确保正确的模块而不是 __main__
是在反序列化之前导入(否则我会收到一条错误消息 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 ).我试图避免这种情况,因为对于我的包的用户来说这可能不直观。
最佳答案
我实际上遇到了同样的问题。
我用的是:
return os.path.splitext(os.path.basename(__main__.__file__))[0]
这实际上与您的“hack”相同。老实说,我认为这是最好的解决方案。
关于Python:确定实际当前模块(不是 __main__),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10746128/