如何解决导入时如何恢复对原始模块的覆盖模块引用?
在我自己的 Odoo 模型中导入 Python 模块时,我注意到该模块以某种方式被 Odoo 损坏或覆盖。这是一些快速测试代码:
import odoo.tools.safe_eval as impmod
print(impmod)
当我在单独的 Python 控制台 (Visual Studio Code) 中启动此代码时,它会打印出预期的结果:
<module 'odoo.tools.safe_eval' from '/home/odoo/odoo13/odoo/tools/safe_eval.py'>
但是,在 Odoo 启动过程中,在 Odoo 环境中执行相同的代码时,打印输出是不同的:
<function <lambda> at 0x7f7e8e0ec8c8>
当我尝试执行函数 impmod()
时,它的行为确实与 safe_eval
函数相同。
模块 safe_eval
恰好有一个同名定义的函数。
因此,我的假设是 Odoo Python 文件中的其他一些代码正在导入 safe_eval
模块,然后以某种讨厌的方式以某种方式覆盖它,因此 safe_eval
模块引用被函数 safe_eval
替换,因此我无法再将 safe_eval
作为模块访问,即使我在代码中将其作为模块导入也是如此。
好消息是,当我通过 sys 访问同一个模块时:
import sys,importlib
sysmod = sys.modules.get('odoo.tools.safe_eval',sys)
print(sysmod)
它打印出预期的结果:
<module 'odoo.tools.safe_eval' from '/home/odoo/odoo13/odoo/tools/safe_eval.py'>
所以,至少该模块没有被 sys.modules
注册表中的函数替换,我仍然可以通过这种肮脏的方式访问它。
仍然让我很困惑。
某些代码怎么可能会严重破坏模块注册表,以至于无法再正确导入模块?
我在这里错过了什么?我远非 Python 专家。
有什么办法可以让import odoo.tools.safe_eval as impmod
按预期工作?
Odoo 和 Visual Studio Code 中的 Python 版本均为 3.6.9。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。