Python:确定实际当前模块(不是 __main__)

标签 python python-module inspection

我正在尝试确定函数的实际当前模块(如从其他地方导入时所见),即使当前模块是“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/

相关文章:

python - 访问变量字典名称的 Python 3x 字典值

python - 在 Python 中使用外部模块和库有哪些方式?

Lisp:检查函数确定其所需的参数

python - 检查大型数据帧在 python 中合并/组合期间是否出现错误

java - 如何使用反射检查方法

python - 当它出现一次时删除子字符串,但在 python 中连续出现两次时不删除

python - 无法从名为 'code' 的模块导入任何函数

python - 如何在 Python/Windows10 上使用 FFMPEG 和 Pipe 进行屏幕录制?

python - 使用 Open CV 屏蔽水平线和垂直线

Python 数组与 json