python - 通过 sys.modules 使虚拟包可用

标签 python import module

假设我有一个包“mylibrary”。

我想让“mylibrary.config”可用于导入,无论是作为动态创建的模块,还是从完全不同的地方导入的模块,然后基本上“安装”在“mylibrary”命名空间内。

也就是说,我这样做:

import sys, types
sys.modules['mylibrary.config'] = types.ModuleType('config')

鉴于该设置:

>>> import mylibrary.config    # -> works

>>> from mylibrary import config
<type 'exceptions.ImportError'>: cannot import name config

更陌生:

>>> import mylibrary.config as X
<type 'exceptions.ImportError'>: cannot import name config

因此似乎使用直接导入有效,而其他形式则无效。是否也可以使这些工作正常?

最佳答案

您不仅需要将模块修补到 sys.modules 中,还需要修补到它的父模块中:

>>> import sys,types,xml
>>> xml.config = sys.modules['xml.config'] = types.ModuleType('xml.config')
>>> import xml.config
>>> from xml import config
>>> from xml import config as x
>>> x
<module 'xml.config' (built-in)>

关于python - 通过 sys.modules 使虚拟包可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/368057/

相关文章:

python - 尝试运行 NiftyNet 快速启动命令时出错

javascript - 它无法识别导入文件中的文件

python - 该模块不知道其在 Python 中的已知包

python - `import directory.module` 和 `import module` 之间的区别

python - 将返回字典的 tf.data.Dataset 传递给 Keras

python - 由于错误卸载Python而在Mac上破坏了Python,如何让模块再次工作?

python - 尝试使用未初始化的值变量 - Tensorflow (Python)

Angular 库模块从模块导出组件、服务等

java - 如何修复这些丢失的库?

javascript - 扩展 Node.js 中模块的功能