通过sys.modules使虚拟包可用

发布于 2021-01-29 15:17:33

说我有一个包“ 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

因此,似乎使用直接导入作品,其他形式则没有。是否有可能使它们也起作用?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您不仅需要将模块猴子修补到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)>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看