Making a virtual package available via sys.modules

前端 未结 3 1095
谎友^
谎友^ 2020-12-25 08:08

Say I have a package \"mylibrary\".

I want to make \"mylibrary.config\" available for import, either as a dynamically created module, or a module imported from an en

相关标签:
3条回答
  • 2020-12-25 08:49

    You need to monkey-patch the module not only into sys.modules, but also into its parent module:

    >>> 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)>
    
    0 讨论(0)
  • 2020-12-25 09:01

    You can try something like this:

    class VirtualModule(object):
      def __init__(self, modname, subModules):
        try:
          import sys
          self._mod = __import__(modname)
          sys.modules[modname] = self
          __import__(modname)
          self._modname = modname
          self._subModules = subModules
        except ImportError, err:
          pass  # please signal error in some useful way :-)
      def __repr__(self):
        return "Virtual module for " + self._modname
      def __getattr__(self, attrname):
        if attrname in self._subModules.keys():
          import sys
          __import__(self._subModules[attrname])
          return sys.modules[self._subModules[attrname]]
        else:
          return self._mod.__dict__[attrname]
    
    
    VirtualModule('mylibrary', {'config': 'actual_module_for_config'})
    
    import mylibrary
    mylibrary.config
    mylibrary.some_function
    
    0 讨论(0)
  • 2020-12-25 09:03

    As well as the following:

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

    You also need to do:

    import mylibrary
    mylibrary.config = config
    
    0 讨论(0)
提交回复
热议问题